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