При написании модульных тестов для простой демонстрации NDK Opengl ES 3.0 я столкнулся с проблемой использования нескольких целей рендеринга. Рассмотрим этот простой шейдер фрагмента с двумя выходами, объявленными в строковом литерале C++ 11.Выходы Mulitple Fragment в GLSL 300 es
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, & вложения [0]), где вложения - это вектор из перечислений GL_COLOR_ATTACHMENTi. Впоследствии я компилирую и связываю шейдер, без каких-либо ссылок или компиляции ошибок (просто использовал простую пересылку вершин, которая неуязвима для этого сообщения).
Есть ли причина, по которой я могу получить местоположение фрагмента для out_color1, но не для out_color2, используя следующую функцию opengles?
auto location = 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.
Есть ли у вас другое устройство, на котором вы можете попробовать? Сколько лет на устройстве построено ОС? Просто из того, что вы разместили здесь, я не вижу ничего плохого. Я обнаружил, что ранее драйверы ES 3.0 были очень глючными. –
Это мое единственное устройство с Opengl ES 3.0 на данный момент. Большое предложение по обновлению сборки ОС. Оказывается, я ожидал обновления Lollipop 5.0.1. К сожалению, после обновления проблема все еще сохраняется. – user4833370