|
1
4
您的代码依赖于 未定义的值 在纹理提取期间。 这个 GLSL 4.60 specification 第8.9节纹理函数(emphasis mine)中的状态:
虽然大多数人认为这些导数仅用于mip映射,但这是不正确的。还需要LOD因子来确定纹理是放大还是缩小(以及在非mipmapped情况下的各向异性过滤,但这在这里并不重要)。 图形处理单元通常通过2x2像素四元组中相邻像素之间的有限差分来近似导数。 发生的事情是,在各种选项之间的边缘,你有非均匀的控制流,其中一行你做纹理过滤,而在上面一行,你不做。有限差分将导致尝试访问上行中纹理采样操作的纹理坐标,这根本不能保证已计算,因为着色器调用没有主动执行该代码路径-这就是规范将其视为未定义的原因。
现在,根据边缘在2x2像素四边形中的位置,可以得到正确的结果,也可以不得到。对于无法得到正确结果的情况,一个可能的结果可能是GL使用缩小滤波器,这是
只需将两个过滤器设置为
唯一正确的解决方案是将纹理采样移出非均匀控制流,如
|