OpenGL主循环内设置矩阵Uniform无法渲染矩形问题求助
OpenGL主循环内设置Uniform无法渲染的问题修复
问题根源
1. 投影矩阵视场角错误
glm::perspective的第一个参数要求是正的视场角(FOV),你代码中使用了glm::radians(-55.0f),这会生成错误的投影矩阵,导致场景坐标空间反转,物体无法正确投影到屏幕。
2. 主循环内矩阵累积变换
主循环内的uModel = glm::rotate(uModel, ...)和uView = glm::translate(uView, ...)是在上一帧的变换矩阵基础上叠加新变换:
- 每帧
uModel额外旋转50度,旋转角度飞速累积,模型很快转出视锥体 - 每帧
uView向-z方向移动4单位,相机持续远离模型,最终模型超出视野
而主循环外的代码只执行一次变换,没有累积,所以能正常显示。
修复方案
1. 修正投影矩阵
将视场角改为正数:
uProj = glm::perspective(glm::radians(55.0f), static_cast<float>(WINDOW_WIDTH)/WINDOW_HEIGHT, 0.1f, 100.0f);
2. 主循环内重新初始化变换矩阵
每次循环从单位矩阵开始计算变换,避免累积:
while(!glfwWindowShouldClose(window)) { glfwPollEvents(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArray(vaoID); // 每次循环重新初始化矩阵,基于单位矩阵计算变换 glm::mat4 uModel = glm::mat4(1.0f); glm::mat4 uView = glm::mat4(1.0f); // 可选:用时间实现平滑动画 const float time = static_cast<float>(glfwGetTime()); uModel = glm::rotate(uModel, glm::radians(50.0f * time), glm::vec3(0.5f, 1.0f, 0.0f)); uView = glm::translate(uView, glm::vec3(0.0f, 0.0f, -4.0f)); shader.SetUniform("u_View", Shader::Type::MAT4, 1, glm::value_ptr(uView), false); shader.SetUniform("u_Model", Shader::Type::MAT4, 1, glm::value_ptr(uModel), false); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eboID); glDrawElements(GL_TRIANGLES, sizeof(elements)/sizeof(uint32_t), GL_UNSIGNED_INT, 0); glfwSwapBuffers(window); CheckOpenGLError(true); }
3. 移除冗余代码
删除主循环外重复的uModel、uView设置代码,避免冲突。
效果验证
修改后,无论矩阵Uniform设置代码位于主循环内还是外,矩形都能正常渲染。若需要动画效果,使用glfwGetTime()作为变换参数可实现平滑的帧间过渡。
内容的提问来源于stack exchange,提问作者Hoyahoyadev
相关产品推荐
相关产品推荐

