世界空间转相机空间渲染:UI场景正交投影矩阵异常如何排查?
问题排查及解决方案
核心问题1:UniformBuffer未同步更新
你在BeginUIScene中仅通过SetMat4单独给Shader设置了u_ViewProjection变量,但后续又调用了s_Data.CameraUniformBuffer->SetData(&s_Data.CameraBuffer, ...)向UniformBuffer写入数据。如果你的TextureShader实际是从UniformBuffer中读取视图投影矩阵而非使用单独的uniform变量,那么你设置的矩阵根本不会生效,s_Data.CameraBuffer中存储的还是旧数据(甚至是空值),导致顶点变换异常无法渲染。
核心问题2:坐标系不匹配
你当前调用getOrtho的参数是(0.0f, camera.GetWidth(), 0.0f, camera.GetHeight(), -1.0f, 1.f),对应左下角为原点、Y轴向上的正交坐标系。如果你的UI顶点是按照行业通用的左上角为原点、Y轴向下的规则定义的,所有UI顶点都会被映射到屏幕可视区域外,自然没有内容输出。
其他可能问题
- 相机参数异常:确认
camera.GetWidth()和camera.GetHeight()返回的是当前视口的正确像素尺寸,如果返回0或负值会导致正交矩阵构造错误。 - Shader输入不匹配:确认
TextureShader中用于顶点变换的矩阵名确实是u_ViewProjection,没有拼写错误,也没有逻辑优先使用UniformBuffer的矩阵而忽略单独设置的uniform变量。
修复步骤
- 同步UniformBuffer数据:在构造完projection矩阵后、调用
SetData前,添加代码将矩阵写入CameraBuffer:
s_Data.CameraBuffer.ViewProjection = projection;
- 对齐UI坐标系:如果你的UI使用左上角原点、Y轴向下的坐标系,修改正交矩阵构造参数:
Mat4 projection = getOrtho(0.0f, camera.GetWidth(), camera.GetHeight(), 0.0f, -1.0f, 1.f);
- 验证Shader逻辑:确认
TextureShader的uniform输入规则和LightTextureShader一致,避免因为Shader差异导致的渲染失败。
内容的提问来源于stack exchange,提问作者tomatto
相关产品推荐
相关产品推荐

