0

在为简单的 NDK Opengl ES 3.0 演示编写单元测试时,我遇到了使用多个渲染目标的问题。考虑这个简单的片段着色器,它有两个输出,在 C++11 字符串文字中声明。

const static std::string multipleOutputsFragment = R"(#version 300 es
    precision mediump float;
    layout(location = 0) out vec3 out_color1;
    layout(location = 1) out vec3 out_color2;
    void main()
    {
        out_color1 = vec3(1.0, 0.0, 0.0);
        out_color2 = vec3(0.0, 0.0, 1.0);
    }
)";

我已经正确设置了一个带有两个颜色附件的 FBO(通过 glFramebufferTexture2D),并且 glCheckFramebufferStatus 以 GL_FRAMEBUFFER_COMPLETE 的形式返回。我也调用 glDrawBuffers(2, &attachments[0]),其中 attachments 是 GL_COLOR_ATTACHMENTi 枚举的向量。之后,我编译和链接着色器,没有任何链接或编译错误(只是使用了与本文无关的简单顶点传递)。

有什么理由可以使用以下 opengles 函数获取 out_color1 的片段位置而不是 out_color2 的片段位置?

自动定位 = glGetFragDataLocation(m_programId, name.c_str());

为 0 的 out_color1 返回正确的位置,但是当向 glGetFragDataLocation 提供“out_color2”时,该函数返回 -1。

我正在物理设备 Galaxy S4、Android 4.4.4 Adreno 320、Opengl ES 3.0 上对此进行测试。

4

1 回答 1

1

如果你打电话:

glReadBuffer(COLOR_ATTACHMENT_1);
glReadPixels(*); 

你能看到你写到 fbo 的数据吗?

于 2015-06-18T08:48:01.533 回答