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

OpenGL修改lookAt矩阵后立方体元素完全消失问题求助

问题原因排查
  • 核心原因:gl_Position需要输出裁剪空间坐标,你当前仅乘以视图矩阵,输出的是视图空间坐标,完全超出了OpenGL默认的裁剪范围,被直接裁剪丢弃所以看不到物体。
    你的glm::lookAt设置相机位于(0,0,2)看向原点,立方体原始坐标z范围是-0.50.5,经过视图变换后,所有顶点的视图空间z值在-1.5-2.5之间。你当前输出的gl_Positionw分量为1,OpenGL默认仅保留x、y、z分量在[-w,w](也就是[-1,1])之间的顶点,所有z值小于-1的顶点全部被裁剪,因此画面上没有任何内容。
  • 其他可能的辅助问题:
    1. 若你开启了面剔除,视图变换后顶点的环绕顺序可能被反转,导致所有可见面被判定为背面被剔除
    2. 你的VAO/VBO配置错误,顶点属性指针设置不正确,也可能导致无渲染输出,可先注释掉视图矩阵的乘法直接输出vec4(aPos, 1.0)测试是否能显示物体,排除基础配置问题。
解决办法
  • 标准修复方案:在顶点着色器中补充投影矩阵乘法,矩阵乘法顺序不要搞反:
    gl_Position = projectionMatrix * viewMatrix * vec4(aPos, 1.0f);
    
    代码中新增透视投影矩阵的设置和传值,示例:
    // 45度视场角,宽高比替换为你的窗口实际宽高比,近平面0.1,远平面100,一般在窗口初始化或大小变化时计算
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);
    // 传给着色器
    shaderProgram_.SetUniformMat4("projectionMatrix", projection);
    
  • 临时测试方案:如果你暂时不想引入投影矩阵,可先将相机移动到立方体内部(比如把lookAt的相机位置z值改为0),或者对视图变换后的z值做缩放让其落到[-1,1]区间内,确认视图矩阵的逻辑正确性。
  • 辅助排查:可以临时关闭面剔除确认是否是剔除导致的问题:
    glDisable(GL_CULL_FACE);
    

内容的提问来源于stack exchange,提问作者snakelovah18119

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 12:27:03