変換行列のコードがいくつかあり、錐台と遠近法を処理する関数をいくつか追加しました。
パースペクティブと呼ぶと、すべてが本当に大きな視野を持っているように見えます(画面の中央では、端が非常に伸びています)。ニア値を大きくすると、この効果はさらに悪くなります。
void Frustum(T left, T right, T bottom, T top, T zNear, T zFar)
{
m[0][0]=2.0f*zNear/(right-left);
m[1][0]=0.0f;
m[2][0]=(right+left)/(right-left);
m[3][0]=0.0f;
m[0][1]=0.0f;
m[1][1]=2.0f*zNear/(top-bottom);
m[2][1]=(top+bottom)/(top-bottom);
m[3][1]=0.0f;
m[0][2]=0.0f;
m[1][2]=0.0f;
m[2][2]=-(zFar+zNear)/(zFar-zNear);
m[3][2]=-2.0f*zFar*zNear/(zFar-zNear);
m[0][3]=0.0f;
m[1][3]=0.0f;
m[2][3]=-1.0f;
m[3][3]=0.0f;
}
void Perspective(T fovy,T aspectRatio,T zNear,T zFar)
{
T xmin,xmax,ymin,ymax;
ymax= zNear* tan(fovy*Math<T>::PI/360.0);
ymin= -ymax;
xmin= ymin*aspectRatio;
xmax= ymax*aspectRatio;
Frustum(xmin,xmax,ymin,ymax,zNear,zFar);
}
クラスがテンプレート化されているため、Tはfloatまたはdoubleです(テストではfloatのみを使用しました)。
私が使用するテスト値はfovy="60" znear="1.0" zfar="1000.0"
であり、それらを変更するとfovy="60" znear="10.0" zfar="1000.0"
、さらに悪化します。
行列はDirectXスタイルですが、OpenGLで使用しているため、シェーダーでの乗算の順序を変更していることに注意してください。
私のコードに何か問題がありますか?
ありがとう