将gl_Position与model矩阵相乘后立方体消失,求解决方法
嘿,我来帮你排查下这个立方体消失的问题~
最可能的核心原因:顶点着色器缺少View和Projection矩阵变换
OpenGL要求gl_Position必须是裁剪空间坐标,但你现在的顶点着色器只对顶点做了Model矩阵变换,得到的只是世界空间坐标。如果不把世界空间坐标通过View矩阵转到相机空间,再通过Projection矩阵转到裁剪空间,顶点大概率会落在OpenGL的可视范围(裁剪空间x/y/z∈[-1,1])之外,直接被裁剪掉。
你需要修改顶点着色器,补上View和Projection矩阵:
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTex; uniform mat4 model; uniform mat4 view; // 新增:相机视图矩阵 uniform mat4 projection; // 新增:投影矩阵 out vec2 aTexture; void main() { // 正确的变换顺序:投影→视图→模型,GLM是列主序,矩阵乘向量的顺序要注意 gl_Position = projection * view * model * vec4(aPos, 1.0f); aTexture = aTex; }
然后在渲染代码里,你需要把这两个矩阵也传给Shader:
// 示例:创建View矩阵(相机在(0,0,3)看向原点) glm::mat4 view = glm::lookAt( glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f) ); // 示例:创建透视投影矩阵 glm::mat4 projection = glm::perspective( glm::radians(45.0f), (float)screenWidth/screenHeight, 0.1f, // 近裁剪面,别设太大,不然会裁掉近处模型 100.0f // 远裁剪面 ); // 把矩阵传给Shader(假设你的GLSLShader类有setMat4方法) shader.use(); shader.setMat4("view", view); shader.setMat4("projection", projection); shader.setMat4("model", m); // 你的Model矩阵
其他可能的排查点
如果补了矩阵还是看不到,再检查下面这些:
- Model矩阵是否正确初始化:你代码里
glm::mat4 m = glm::tr...是不完整的,别不小心写了glm::scale(m, glm::vec3(0,0,0))这种把模型缩没的操作,先把Model设为单位矩阵glm::mat4 m(1.0f)测试,看模型能不能显示。 - Uniform是否正确传递:确认你有没有调用传递矩阵的代码,比如
glUniformMatrix4fv(或者你的Shader类封装的方法),如果没传,Model矩阵会是垃圾值,顶点会被扔到不可见的位置。 - 顶点数据是否正常:检查立方体的顶点坐标是不是都堆在(0,0,0),或者范围大到超出了视锥体(比如顶点坐标是(-100,-100,-100)到(100,100,100))。
内容的提问来源于stack exchange,提问作者Kacper Czyż
相关产品推荐
相关产品推荐

