OpenGL渲染随时间旋转的2D三角形出现渲染异常求助
渲染异常的核心成因及修复方案
- 顶点着色器矩阵乘法顺序错误
OpenGL 顶点从模型空间到裁剪空间的标准变换逻辑为:投影矩阵 × 视图矩阵 × 模型矩阵 × 顶点坐标。你当前着色器内的计算式为model * view * projection * vec4(aPos, 1.0f),完全颠倒了变换顺序。初始帧时旋转角度为0,模型矩阵为单位矩阵,凑巧能输出接近正确的结果;随着模型矩阵随时间旋转,坐标空间逻辑完全错乱,直接导致三角形形态异常。 - 投影矩阵赋值逻辑失效
每帧初始化时你都将projection重置为单位矩阵,仅当changeProjection标记为真时才会赋值透视投影,赋值完成后立刻将标记置为假。这意味着除了首次触发的那一帧,后续所有帧传给着色器的projection都是无透视效果的单位矩阵,坐标系参数完全不符合预期。 - 潜在的Shader绑定不匹配问题
你在UpdateCamera中设置 uniform 时使用的是lvl->shader.GetShaderID(),但绘制时调用glUseProgram(m_shaderID),如果这两个ID不属于同一个着色器程序,你设置的所有矩阵参数根本不会被应用到绘制流程中。
修复步骤
- 修正顶点着色器的矩阵乘法顺序:
gl_Position = projection * view * model * vec4(aPos, 1.0f); - 调整投影矩阵赋值逻辑,每帧都正确计算投影矩阵,仅在窗口尺寸变化时更新宽高比参数即可,不要依赖一次性的标记变量:
glm::mat4 projection = glm::perspective(glm::radians(90.0f), (float)800 / (float)600, 0.1f, 100.0f); - 保证设置 uniform 前绑定的着色器程序,和绘制时使用的是同一个ID,建议在设置任何 uniform 前先显式调用
glUseProgram绑定对应程序,避免参数设置失效。
内容的提问来源于stack exchange,提问作者Denmuell
相关产品推荐
相关产品推荐

