Вывод нескольких фрагментов в GLSL 300 es

При написании модульных тестов для простой демонстрации 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.


person user4833370    schedule 26.04.2015    source источник
comment
У вас есть другое устройство, на котором вы можете попробовать? Сколько лет сборке ОС на устройстве? Судя по тому, что вы написали здесь, я не вижу ничего плохого. Я обнаружил, что более ранние драйверы ES 3.0 были очень глючными.   -  person Reto Koradi    schedule 27.04.2015
comment
На данный момент это мое единственное устройство с Opengl ES 3.0. Отличное предложение по обновлению сборки ОС. Оказывается, меня ждало обновление Lollipop 5.0.1. К сожалению, после обновления проблема осталась.   -  person user4833370    schedule 28.04.2015


Ответы (1)


если вы позвоните:

glReadBuffer(COLOR_ATTACHMENT_1);
glReadPixels(*); 

вы можете видеть данные, которые вы записываете в fbo?

person Gal Kamar    schedule 18.06.2015