添加3D维度与Z轴旋转后OpenGL渲染对象不显示
问题原因与修复方法
程序无报错但仅显示清屏色,是3处API使用逻辑错误导致的,语法层面完全合法所以不会触发编译/运行警告:
- CGLM矩阵初始化方式错误
代码中mat4 model = {{1.0f}};这类写法遵循C语言聚合初始化规则:仅会将显式赋值的第一个矩阵元素model[0][0]设为1.0f,其余15个元素默认初始化为0,完全不符合单位矩阵的定义(单位矩阵要求对角线4个元素全为1,其余元素为0)。基于错误的初始矩阵执行旋转、平移、透视投影计算,得到的变换矩阵数学值完全错误,所有顶点变换后都会落在视锥体裁剪范围外,无法被渲染。 - Uniform传值前未激活对应着色器程序
所有glUniform*系列函数,仅会修改当前通过glUseProgram绑定的激活着色器的Uniform值。如果传值前未绑定目标着色器,矩阵数据不会传入着色器,着色器中三个变换矩阵会保持初始零值,顶点坐标变换全部失效。 - 3D渲染必要配置缺失
实现3D效果必须开启深度测试,否则会因为深度值判断错误丢弃所有片段;同时每帧清屏时需要同步清除深度缓冲,否则深度值残留会导致渲染结果异常。
修正后的代码
首先替换矩阵初始化逻辑,使用CGLM官方提供的单位矩阵初始化宏,禁止手动用{{1.0f}}初始化矩阵:
// 正确初始化单位矩阵 mat4 model = GLM_MAT4_IDENTITY_INIT; mat4 view = GLM_MAT4_IDENTITY_INIT; mat4 projection = GLM_MAT4_IDENTITY_INIT; glm_rotate(model, glm_rad(-55.0f), (vec3){1.0f, 0.0f, 0.0f}); // 场景向相机反方向平移 glm_translate(view, (vec3){0.0f, 0.0f, -3.0f}); glm_perspective(glm_rad(45.0f), (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT, 0.1f, 100.0f, projection); // 传Uniform前必须先绑定目标着色器 glUseProgram(myShaderPtr->shaderID); GLint modelLoc = glGetUniformLocation(myShaderPtr->shaderID, "model"); GLint viewLoc = glGetUniformLocation(myShaderPtr->shaderID, "view"); GLint projectionLoc = glGetUniformLocation(myShaderPtr->shaderID, "projection"); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, (const GLfloat*)model); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, (const GLfloat*)view); glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, (const GLfloat*)projection);
在程序初始化阶段(渲染循环启动前)添加深度测试启用代码:
glEnable(GL_DEPTH_TEST);
修改每帧清屏逻辑,同时清除颜色缓冲和深度缓冲:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
补充说明
提供的顶点着色器代码逻辑正确,矩阵乘法顺序(projection * view * model)符合OpenGL坐标变换规则,修复上述问题后即可正常渲染出带透视旋转效果的纹理矩形。
内容的提问来源于stack exchange,提问作者user16309487
相关产品推荐
相关产品推荐

