You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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ż

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:10:15