我有一个立方体,它的中心定义为 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;
}