2

我想在opengl es 3.0中实现MRT。因此创建了一个带有纹理的帧缓冲区作为 GL_RGBA32UI 类型的 GL_COLOR_ATTACHMENT0 附件。在该帧缓冲区上渲染 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 渲染到默认帧缓冲区。

尝试对我的 FBO 使用 glDrawBuffer(1, {GL_COLOR_ATTACHMENT0 }),但无法了解如何将 ex_colour 用于默认帧缓冲区。

4

1 回答 1

3

我认为通过使用两种不同的着色器可以省去很多麻烦。在 ES 3.0 中允许的值集glDrawBuffers比在完整的 OpenGL 中要严格得多。

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

实际上,您可能正在尝试渲染纹理并在同一渲染通道中使用纹理。如果真是这样,那真是个坏主意。它设置了规范所称的“渲染反馈循环”。您可以阅读详细信息,但通常不会起作用。无论如何,您不能同时渲染到 FBO 和默认帧缓冲区。

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

于 2014-04-30T16:17:22.637 回答