1
4
您的代码依赖于 未定义的值 在纹理提取期间。 这个 GLSL 4.60 specification 第8.9节纹理函数(emphasis mine)中的状态:
虽然大多数人认为这些导数仅用于mip映射,但这是不正确的。还需要LOD因子来确定纹理是放大还是缩小(以及在非mipmapped情况下的各向异性过滤,但这在这里并不重要)。 图形处理单元通常通过2x2像素四元组中相邻像素之间的有限差分来近似导数。 发生的事情是,在各种选项之间的边缘,你有非均匀的控制流,其中一行你做纹理过滤,而在上面一行,你不做。有限差分将导致尝试访问上行中纹理采样操作的纹理坐标,这根本不能保证已计算,因为着色器调用没有主动执行该代码路径-这就是规范将其视为未定义的原因。
现在,根据边缘在2x2像素四边形中的位置,可以得到正确的结果,也可以不得到。对于无法得到正确结果的情况,一个可能的结果可能是GL使用缩小滤波器,这是
只需将两个过滤器设置为
唯一正确的解决方案是将纹理采样移出非均匀控制流,如
|
Jimmy Yang · 何时需要进行透视分割? 2 年前 |
Max Mister · 使用鼠标事件计算相机的位置和旋转 6 年前 |
Lane will · OpenGL选择区域 6 年前 |
synchronizer · openGL 2D视差滚动纹理撕裂/接缝 6 年前 |
Steven Venham · OpenGL单通道到多通道的可行性 6 年前 |
Andrew Lundgren · 如何在OpenTK(迷你地图!) 6 年前 |
Kevin Su · 无法在opengl中正确绘制我的汽车 6 年前 |
user1832287 · 来自细分控制点的边上的瑕疵 6 年前 |