2015-04-26 3 views
0

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

+0

Есть ли у вас другое устройство, на котором вы можете попробовать? Сколько лет на устройстве построено ОС? Просто из того, что вы разместили здесь, я не вижу ничего плохого. Я обнаружил, что ранее драйверы ES 3.0 были очень глючными. –

+0

Это мое единственное устройство с Opengl ES 3.0 на данный момент. Большое предложение по обновлению сборки ОС. Оказывается, я ожидал обновления Lollipop 5.0.1. К сожалению, после обновления проблема все еще сохраняется. – user4833370

ответ

1

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

glReadBuffer(COLOR_ATTACHMENT_1); 
glReadPixels(*); 

вы можете увидеть данные, которые вы пишете в FBO?