如何在 WEBGL 中使用 gl_LastFragData?

How to use gl_LastFragData in WEBGL?

我目前正在做一个 THREE.JS 项目。我需要使用可编程混合来自定义 fragment_shader,而不是使用预定义的混合。为此,我想在 fragment_shader 中使用 gl_LastFragData。但是我得到了这个错误。Error image

如何在 WEBGL 中使用 gl_LastFragData 或者是否有其他等效方法?

WebGL 中没有 gl_LastFragData。 WebGL 基于 OpenGL ES 2.0,WebGL2 基于 OpenGL ES 3.0。这些都不支持 gl_LastFragData

使用上一个结果的传统方式是在生成下一个结果时将其作为纹理传入

someOperation1(A, B)            -> TempTexture1
someOperation2(TempTexture1, C) -> TempTexture2
someOperation3(TempTexture2, D) -> TempTexture1
someOperation4(TempTexture1, E) -> TempTexture2
someOperation5(TempTexture2, F) -> resultTexture/fb/canvas/window

Example

gl_LastFragData 不存在于 webgl 或 opengl 规范中。 然而这些 API 中有 extensions 机制。

您可以在程序启动时查询可用的扩展,看看是否有所需的功能。要在着色器程序中使用可用扩展,您应该在着色器源代码中 activate 它。

您的错误消息说您在扩展功能不可用时尝试使用它。

说到你的具体情况 - 检查 EXT_shader_framebuffer_fetch extension. Also worth checking ARM_shader_framebuffer_fetch、NV_shader_framebuffer_fetch。

然而,这些扩展是针对 OpenGL 2.0、OpenGL ES2.0 编写的。我不确定它们是否确实存在 webgl extensions.

希望帧缓冲区提取功能出现在移动设备上,而不出现在桌面设备上。据我了解,这是由于移动和桌面 GPU 架构之间的差异(基于图块的光栅化器与即时模式光栅化器)。基于 Tile 的 gpu 可以使用 tile 本地内存进行有效查找。