【问题标题】:GLSL : accessing framebuffer to get RGB and change itGLSL:访问帧缓冲区以获取 RGB 并更改它
【发布时间】:2017-02-03 12:31:07
【问题描述】:

我想访问帧缓冲区以获取 RGB 并更改每个像素的值。这是因为 glReadPixels 和 glDrawPixels 使用起来太慢了,所以我应该使用着色器而不是使用它们。

现在,我编写代码,并成功使用 GLSL 着色器显示三维模型。

我画了两个立方体如下。

.... 
glDrawArrays(GL_TRIANGLES, 0, 12*6);
.... 

和片段着色器:

varying vec3 fragmentColor;
void main()
{
    gl_FragColor = vec4(fragmentColor, 1);
}

那么,如何访问 RGB 值并对其进行更改? 比如window上(u1,v1)和(u2,v2)处的像素值为(0,0,255),那么我想把它们改成(255,0,0)

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    除了 OpenGL ES-only 扩展之外,片段着色器不能只从当前帧缓冲区中读取。否则,我们就不需要blending

    您也不能只在着色器中渲染到正在读取的图像。因此,如果您需要进行某种后期处理,那么最好通过渲染到单独的图像来完成。也就是说,您对图像 1 进行渲染,然后将其绑定为纹理并更改 FBO,以便您渲染到图像 2。

    或者,如果您有权访问OpenGL 4.5/ARB/NV_texture_barrier,则可以使用纹理屏障来处理此问题。如果您将当前帧缓冲区的图像绑定为纹理,这将允许您进行单个 读取/修改/写入过程。您会在读取/修改/写入之前发出屏障,然后将该纹理绑定到采样器,同时仍渲染到该帧缓冲区。

    此外,这要求 FS 从其将写入的精确纹素 中读取。假设视口锚定在 0,0,则代码为texelFetch(sampler, ivec2(gl_FragCoord.xy), 0)。你不能从别人的纹素中读取并修改它。

    显然你必须渲染到纹理;您不能为此使用默认帧缓冲区。

    纹理屏障可用于从不同纹素读取而不是写入的情况。但这需要做一些类似于切换绑定图像的第一种情况。尽管您不需要完全更改 FBO;您可以更改您渲染到的 FBO 的区域。也就是说,只要您从与渲染不同的区域读取数据,并且在这些区域之间切换时适当地使用障碍,一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多