我们有一个 webgl/three.js 应用程序,它广泛使用纹理缓冲区在 channel 之间传递数据和存储数据数组。这些都对 mipmap 没有任何用处。我们可以轻松地阻止 mipmap 生成:在three.js 级别,我们将 min 和 mag 过滤器设置为 NearestFilter,并将 generateMipmaps 设置为 false。
但是,着色器不知道 编译没有 mipmapping 的时间。使用 ANGLE 编译时,我们会收到很多警告消息:
警告 X4121:必须将基于梯度的操作移出流量控制以防止发散。使用非梯度操作可能会提高性能
我已经重新编码,以便(可选)避免围绕此类查找的流程。
在我的 Windows/NVidia 机器上,使用条件流提高了性能并且不会导致任何视觉问题(但会导致消息)。
我不希望纹理查找是基于梯度的操作。我想做的是以他们知道的方式编写着色器 编译没有决定的时间;这应该(略微)提高性能并使消息消失。但是,我看不到在 GLSL 中为 GLES 2(由 webgl 使用)执行此操作的任何方法。它可以在以后的版本中使用 textureLodOffset() 和其他各种方式来完成。我能看到的第 2 级中唯一的控制是 texture2D() 上的偏差选项,但这是偏差不是绝对值,因此不能解决问题。所以,最后...
问题:您知道有什么方法可以防止 WEBGL 级别 GLSL 着色器中的 lod 计算吗?
最佳答案
您可以尝试确保:
gl_FragCoord
而不是用户变化 NEAREST
设置在 texImage2d
之前, 而不是在 关于three.js - 我可以避免在 webgl 中进行纹理梯度计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33175398/