天天看點

軟體光栅化渲染器一

為了了解光栅化渲染器工作原理及底層實作,準備着手寫一個光栅化渲染器。

第一節,我打算先實作所需要的數學庫。

mathf.h中主要包含如下數學方法:

float radians(float value);
float clamp(float value, float min1 = 0, float max1 = 1);
float lerp(float min, float max, float gradient);
float smoothStep(float min,float max,float x);
           

vectorf.h中包含vector2和vector3兩個結構體,主要實作了:

float Distance(Vector2 &value)const;
float Dot(const Vector2 &value)const;
float Magnitude()const;
Vector2 Normalize()const;
Vector3 Cross(const Vector3 &value)const;
float Distance(Vector3 &value)const;
float Dot(const Vector3 &value)const;
float Magnitude()const;
Vector3 Normalize()const;
           

并且實作了運算符重載。

matrix.h中實作了Matrix4x4結構體,内部主要是對運算符進行重載。

重點來了,rmathf.h中實作了所有要用到的通用數學運算方法:

float Distance(Vector2 value1, Vector2 value2)
float Dot(const Vector2 &left, const Vector2 &right)
float Magnitude(const Vector2 &value)
Vector2 Lerp(const Vector2 & start, const Vector2 & end, float amount)
Vector2 Normalize(const Vector2 &value)
Vector2 Reflect(Vector2 vector, Vector2 normal)


Vector3 Cross(const Vector3 &left, const Vector3 &right)
float Distance(Vector3 value1, Vector3 value2)
float Dot(const Vector3 &left, const Vector3 &right)
float Magnitude(const Vector3 &value)
Vector3 Normalize(const Vector3 &value)
Vector3 Lerp(const Vector3 & start, const Vector3 & end, float amount)
Vector3 Reflect(Vector3 vector, Vector3 normal)
Vector3 TransformCoordinate(Vector3 &coord, Matrix4x4 &transMat)

Matrix4x4 LookAtRH(Vector3 &cameraPos, Vector3 &target, Vector3 &up)
Matrix4x4 LookAtLH(Vector3 &cameraPos, Vector3 &target, Vector3 &up)
Matrix4x4 Translation(Vector3 &value)
Matrix4x4 PerspectiveFovRH(float fov, float aspect, float znear, float zfar)
Matrix4x4 PerspectiveFovLH(float fov, float aspect, float znear, float zfar)
Matrix4x4 RotationX(float angle)
Matrix4x4 RotationY(float angle)
Matrix4x4 RotationZ(float angle)
Matrix4x4 RotationYawPitchRoll(float yaw, float pitch, float roll)
Matrix4x4 Rotate(Vector3 &rotate)
Matrix4x4 Scale(float x, float y, float z)
Matrix4x4 Scale(Vector3 &scale)
           

以上再結合c++的數學庫可以滿足這個demo的基本需求。

github位址:https://github.com/wenshuiqing/Render3D

繼續閱讀