При написании модульных тестов для простой демонстрации NDK Opengl ES 3.0 я столкнулся с проблемой использования нескольких целей рендеринга. Рассмотрим этот простой шейдер Fragment с двумя выходными данными, объявленный в строковом литерале 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]), где вложения — это вектор перечислений GL_COLOR_ATTACHMENTi. После этого я компилирую и связываю шейдер без каких-либо ошибок связывания или компиляции (просто использовал простое прохождение вершин, которое не имеет отношения к этому посту).
Есть ли причина, по которой я могу получить местоположение фрагмента для out_color1, но не для out_color2, используя следующую функцию opengles?
автоматическое расположение = glGetFragDataLocation (m_programId, name.c_str());
Для out_color1 возвращается правильное местоположение, равное 0, но при предоставлении "out_color2" для glGetFragDataLocation функция возвращает -1.
Я тестирую это на физическом устройстве, Galaxy S4, Android 4.4.4 Adreno 320, Opengl ES 3.0.