OpenGL 不渲染Mesh问题:继承自定义Window2类后网格无法绘制
问题1:视图矩阵计算错误(核心故障)
你在Game::initialize中配置glm::lookAt的参数存在逻辑错误:
- 相机位置
viewPosition = glm::vec3(0, 1, 0) - 观察目标是原点
glm::vec3(0, 0, 0) - 上方向向量是
glm::vec3(0, 1, 0)
此时视线方向为目标 - 位置 = (0,-1,0),和上方向向量完全共线反向,glm::lookAt计算叉乘得到的右向量会是零向量,最终生成的视图矩阵完全错误,导致所有顶点坐标变换后超出可视范围。
修复方案:将相机位置往Z轴正方向移动,避免和上方向共线,例如:
viewPosition = glm::vec3(0, 1, 3);
问题2:缺失模型矩阵Uniform赋值
你在Game::render中只给Shader传递了投影矩阵P和视图矩阵V,没有传递模型矩阵M。如果你的Shader顶点着色器中使用了M*V*P的变换逻辑,缺失的M矩阵会被默认填充为垃圾值,导致模型位置不可预知。
修复方案:在渲染时补充模型矩阵赋值,默认用单位矩阵即可:
shader->setMat4("M", glm::mat4(1.0f));
问题3:清空颜色顺序错误
Window2::run中的清空逻辑顺序颠倒:先调用glClear再设置glClearColor,会导致第一帧清空的颜色为默认黑色,后续帧清空的是上一帧设置的颜色,虽然不会直接导致渲染失败,但属于逻辑错误。
修复方案:调换顺序:
glClearColor(0.8, 0.8, 0.8, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
问题4:点光环境光为0可能导致模型全黑
你初始化PointLight时,环境光分量设置为glm::vec3(1.0) * 0.0f,如果模型背向点光源,漫反射和高光分量都会为0,最终模型会输出纯黑色和背景融为一体无法识别。
修复方案:给环境光设置一个基础值,例如:
glm::vec3(1.0, 1.0, 1.0) * 0.1f
问题5:未显式设置视口
你在Window2::intitialize2中注释掉了setSize(m_width, m_height)调用,而setSize中才会执行glViewport设置视口范围,虽然大多数驱动默认会将视口设为窗口大小,但属于不稳定的隐式行为。
修复方案:取消setSize调用的注释。
内容的提问来源于stack exchange,提问作者randCoder

