【问题标题】:Is there a way in Opengl es 2.0 fragment shader, to get a previous fragment colorOpengl es 2.0片段着色器中有没有办法获得以前的片段颜色
【发布时间】:2021-04-14 22:38:39
【问题描述】:

我的代码正在绘制背景图像并在该图像之上绘制一些其他图像(粒子)。 我想让粒子有一些混合效果,比如变暗、变亮、燃烧……就像 Canvas globalcompositeoperation 一样。 所以在片段着色器中,我需要获取以前的片段颜色并将其与新颜色混合。 但我找不到办法。

【问题讨论】:

  • httpdigest ,你能帮我怎么做硬件混合吗?

标签: android opengl-es glsl opengl-es-2.0 fragment-shader


【解决方案1】:

不,标准内没有可能性。但是,通过扩展 EXT_shader_framebuffer_fetch(非 Mali 设备)和 ARM_shader_framebuffer_fetchMali 设备),可以从帧缓冲区中读取一个值(从 OpenGL 2.0 和 OpenGL ES 2.0 / 3.0 开始):

这个扩展提供了一种机制,片段着色器可以读取现有的帧缓冲区数据作为输入。这可用于实现固定功能混合不方便或不可能的合成操作。它还可以用于将函数应用于帧缓冲区颜色,方法是编写一个使用现有帧缓冲区颜色作为其唯一输入的着色器。

请注意,不能保证硬件会支持扩展。您需要在运行时测试该扩展是否受支持。

如果你想从之前的渲染中读取片段,通常的方法是实现多个渲染通道并渲染到一个纹理。另见LearnOpenGL - Deferred Shading

在很多情况下,片段着色器中不需要读取片段。使用标准的Blending 功能可以实现很多渲染效果。可以用glBlendFunc改变混合函数,用glBlendEquation改变混合方程。

【讨论】:

    【解决方案2】:

    是的,这是可能的。 首先,将结果渲染到纹理缓冲区。 然后将纹理缓冲区发送到第二个着色器以应用效果。

    要了解如何执行此操作,请查找关键字 GLES20.glBindFramebuffer(GL_FRAMEBUFFER, mFramebuff);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多