如何在opengles 3.0中实现多个渲染目标

时间:2014-04-30 12:59:07

标签: opengl-es opengl-es-3.0

我想在opengl es 3.0中实现MRT。因此创建了一个带纹理的帧缓冲区作为GL_COLOR_ATTACHMENT0类型为GL_RGBA32UI的附件。在该帧缓冲区上渲染GL_RGBA32UI的纹理图像。然后将帧缓冲区数据作为纹理读取并将其作为纹理应用于默认缓冲区。 (基本上使用INTEGER纹理渲染到纹理)

我正在尝试为自定义FBO和默认FBO使用相同的片段着色器。

precision highp float;
uniform highp usampler3D    stexture;
in  vec4    out_TexCoord;
uniform highp uint              range;
layout(location = 0) out uvec4 uex_colour;
layout(location = 1) out vec4 ex_colour;
void main(void)
{
    uex_colour = uvec4(texture(stexture, out_TexCoord.xyz));
    ex_colour = vec4(texture(stexture, out_TexCoord.xyz))/(range);
    ex_colour = vec4(vec3(ex_colour.xyz), 1.0);
}

想要使用uex_color渲染自定义帧缓冲区,并使用ex_color渲染默认帧缓冲区。

尝试使用glDrawBuffer(1,{GL_COLOR_ATTACHMENT0})作为我的FBO,但无法获得如何使用ex_colour作为默认帧缓冲区。

1 个答案:

答案 0 :(得分:2)

我认为通过使用两种不同的着色器,您可以省去很多麻烦。 {3}中允许的glDrawBuffers值集在ES 3.0中比在完整的OpenGL中限制得多。

特别是在您的情况下,使用您尝试使用的片段着色器,在后台缓冲区中输出的内容是1.但是对于默认的帧缓冲区,您只能有一个绘制缓冲区,它必须是{{ 1}}。因此,您只能使用输出0来绘制后台缓冲区。

实际上看起来您可能正在尝试渲染纹理并在同一渲染过程中使用纹理。如果是这样的话,这是一个非常糟糕的主意。它设置了规范称为“渲染反馈循环”的内容。您可以阅读详细信息,但通常不会起作用。无论如何,你无法同时渲染到FBO和默认的帧缓冲区。

您需要执行一次渲染到FBO以生成纹理,然后再渲染另一次渲染到默认帧缓冲区,对纹理进行采样。您将为这两个过程使用不同的着色器。