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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:27:21