在为简单的 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 上对此进行测试。