0

中心が 0,0,0 で、エッジが -1/+1 に達するように定義された立方体があります (つまり、立方体の幅、高さ、深さは 2 です)。

次に、次のマトリックスをセットアップします。

glm::mat4 modelMat4;
modelMat4 = glm::translate(modelMat4, 0.0f, 0.0f, 200.f);
modelMat4 = glm::scale(modelMat4, 200.0f, 200.0f, 200.0f);

glm::mat4 viewMat4;
viewMat4 = glm::lookAt(glm::vec3(0.0f, 0.0f, zNear),
            glm::vec3(0.0f, 0.0f, zFar),
            glm::vec3(0.0f, 1.0f, 0.0f));

// initialWidth = window width
// initialHeight = window height
// zNear = 1.0f
// zFar = 1000.0f
glm::mat4 projectionMat4;
projectionMat4 = glm::frustum(-initialWidth / 2.0f, initialWidth / 2.0f, -initialHeight / 2.0f, initialHeight / 2.0f, zNear, zFar);

しかし、オブジェクトの中央は近い z 平面に表示されます (つまり、キューブの後ろ半分しか内側から見ることができません)。

モデル変換を次のように調整すると:

glm::translate(modelMat4, 0.0f, 0.0f, 204.f);

次に、キューブの前面も見ることができます。

モデル変換を次のように変更すると:

glm::translate(modelMat4, 0.0f, 0.0f, 250.f);

次に、立方体は約 2x2x2 ピクセルでのみラスタライズされます。

モデル、ビューの射影行列について誤解していることは何ですか? 変換が線形であると予想していましたが、z 平面は 200 から 250 の間で消えます。平面は 1.0f から 1000.0f の間で定義されていますが。

編集:私のシェーダーコードは以下の通りです:

#version 100

layout(location = 0) in vec3 v_Position;
layout(location = 1) in vec4 v_Colour;

layout(location = 2) uniform mat4 v_ModelMatrix;
layout(location = 3) uniform mat4 v_ViewMatrix;
layout(location = 4) uniform mat4 v_ProjectionMatrix;

out vec4 f_inColour;

void main()
{
    gl_Position = v_ProjectionMatrix * v_ViewMatrix * v_ModelMatrix * vec4(v_Position, 1.0);
    f_inColour = v_Colour;
}
4

1 に答える 1