【发布时间】:2016-01-15 11:55:38
【问题描述】:
我们有一个 webgl/three.js 应用程序,它广泛使用纹理缓冲区在通道之间传递数据和存储数据数组。这些都对 mipmap 没有任何用处。我们可以很容易地阻止 mipmap 生成:在 three.js 级别,我们将 min 和 mag 过滤器设置为 NearestFilter,并将 generateMipmaps 设置为 false。
但是,着色器在编译时并不知道没有 mipmapping。使用 ANGLE 编译时,我们会收到很多警告消息:
警告 X4121:必须将基于梯度的操作移出流控制以防止发散。使用非梯度操作可以提高性能
我已经重新编码,以便(可选地)避免围绕此类查找的流程。 在我的 Windows/NVidia 机器上,使用条件流可以提高性能并且不会导致任何视觉问题(但会导致消息)。
我不希望纹理查找是基于梯度的操作。我想做的是以他们在编译时知道没有决定的方式编写着色器;这应该(略微)提高性能并让消息消失。但是,我在 GLES 2 的 GLSL 中看不到任何方法(由 webgl 使用)。它可以在以后的版本中使用 textureLodOffset() 和其他各种方式来完成。我可以看到的第 2 级中唯一的控制是 texture2D() 上的偏差选项,但这是一个偏差而不是绝对值,因此不能解决问题。所以,最后……
问题:您知道在 WEBGL 级别 GLSL 着色器中防止 lod 计算的任何方法吗?
【问题讨论】:
标签: three.js glsl webgl glsles