模型视图投影会导致失真

本文关键字:失真 视图 投影 模型 | 更新日期: 2023-09-27 18:22:15

我的世界里有一个立方体,我每帧都会平移0.0f、0.01f、0.0f,但这会导致立方体变得非常扭曲

我99%确信这是MVP的问题,因为我是如何设置它的,乘以变量或其他与之相关的因素。这就是我设置每个变量的方式,每次更新帧时都会将模型矩阵发送到着色器,加载窗口时会发送一次相机和投影矩阵。

来源:http://pastebin.com/FsY0GS6K

相机、投影&模型矩阵

m_cube_matrix = Matrix4.Identity;
m_camera = Matrix4.LookAt(new Vector3(2.0f, 2.0f, -1.5f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
int _u_camera = GL.GetUniformLocation(m_shader.m_shader_program_id, "uCamera");
GL.UniformMatrix4(_u_camera, false, ref m_camera);
m_projection = Matrix4.CreatePerspectiveFieldOfView(1.5f, 800.0f / 600.0f, 0.1f, 10.0f);
int _u_projection = GL.GetUniformLocation(m_shader.m_shader_program_id, "uProjection");
GL.UniformMatrix4(_u_projection, false, ref m_projection);

顶点着色器

#version 330
uniform mat4 uModel;
uniform mat4 uCamera;
uniform mat4 uProjection;
in vec3 vPosition; 
in vec3 vNormal;
out vec3 oNormal;
out vec3 oPosition;
void main(void)
{
   gl_Position = uProjection * uCamera * uModel * vec4(vPosition, 1);
   oNormal = normalize(gl_NormalMatrix * vNormal);
   oPosition = vPosition;
}  

模型视图投影会导致失真

您的变换矩阵是转置的

您对所有矩阵使用相同的矩阵函数,但将m_cube_matrix作为转置矩阵发送到GL,而对所有其他矩阵则不这样做。

从您的代码:

GL.UniformMatrix4(_u_model, true, ref m_cube_matrix);
//                          ^^^^ you are transposing your matrix here