延迟贴花渲染器像素剔除异常及纹理采样问题排查
延迟贴花渲染器开发问题排查
开发背景与已完成工作
我正在实现延迟贴花渲染器,遵循以下开发步骤:
- 贴花实例包含
decalToWorld和worldToDecal两个矩阵 - 采用
front face culling(正面剔除)渲染贴花 - 顶点着色器将单位立方体顶点转换到裁剪空间
- 像素着色器逻辑:通过裁剪空间XY采样深度纹理,经
inverseViewProjection转换到世界空间,再通过worldToDecal转换到贴花空间,最后在贴花空间位置执行裁剪测试,超出单位立方体的像素将被丢弃
已完成工作:通过按下G键在与父物体交点处生成贴花,矩阵计算、正面剔除、顶点着色器逻辑均已实现。
遇到的问题
- 第一版像素着色器代码执行后,像素未正确被剔除(仅显示红色),参考Metal延迟屏幕空间贴花代码修改后,显示恢复正常(正确显示蓝色区域)
- 使用参考代码的纹理采样方式时,贴花纹理出现失真问题
问题原因分析
1. 第一版像素着色器剔除逻辑失效的可能原因
- 贴花空间坐标范围判断错误:第一版代码可能误将贴花空间的单位立方体范围判断写成
[0,1]而非[-0.5,0.5],或是判断条件的逻辑符号写反(比如用>替代<),导致所有像素都通过/被剔除,最终仅显示纯色。 - 矩阵转换顺序错误:
worldToDecal矩阵的乘法顺序出错,比如将世界空间坐标与矩阵相乘时顺序搞反,导致转换后的贴花空间坐标完全偏离单位立方体范围,裁剪测试完全失效。 - 深度纹理采样与NDC转换错误:采样深度纹理后未正确将深度值从
[0,1]映射到[-1,1]的NDC空间Z值,导致通过inverseViewProjection转换出的世界空间坐标错误,后续贴花空间的裁剪自然失效。 - 裁剪测试不完整:第一版代码可能只对部分坐标轴做了范围判断,或是在转换到贴花空间前就执行了裁剪,导致超出单位立方体的像素未被正确剔除。
2. 纹理采样失真的可能原因
- UV坐标映射错误:参考代码的UV转换逻辑未适配你的贴花空间范围,比如直接将
[-0.5,0.5]范围的贴花空间坐标作为[0,1]范围的UV使用,导致纹理拉伸或偏移。 - 纹理过滤模式不匹配:如果贴花UV存在非整数偏移/缩放,却使用
Point Filter(点过滤),会出现锯齿或块状失真;若用Bilinear Filter但UV计算存在精度问题,则会出现模糊或错位。 - 矩阵转换精度损失:多次矩阵乘法导致浮点数精度丢失,贴花空间坐标出现偏差,进而使UV计算出错,最终表现为纹理失真。
- Mipmap层级错误:参考代码错误指定了mipmap层级,或是未根据贴花屏幕大小自动计算合适层级,导致采样到错误的纹理层级,出现模糊或块状失真。
内容的提问来源于stack exchange,提问作者Shout
相关产品推荐
相关产品推荐

