three.js - 我可以避免在 webgl 中进行纹理梯度计算吗?

标签 three.js glsl webgl glsles

我们有一个 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/

    相关文章:

    opengl - 如何计算法线矩阵?

    javascript - 如何有效地从 webgl 属性缓冲区的中间删除三 Angular 形

    javascript - 如何在 Three.js 中不在 Canvas 上实际渲染场景的情况下获取场景的像素数据?

    javascript - 如何在 Three.js 中移动其位置时保持相机旋转指向原点?

    c++ - GLSL 错误 : Undefined layout buffer variable in compute shader, 虽然已定义

    glsl - 使用 Glium 中的 UniformBuffer 将任意大小的对象传递给片段着色器

    webgl - ThreeJS 正交相机 : Adjusting size of scene to window

    three.js - 如何根据子项的宽度将 THREE.Group 居中?

    javascript - Three.js 中的内存泄漏

    c++ - glsl 错误 : "v_color" not declared as an output from the previous stage while trying to render wtih tesselation shaders