Как реализовать несколько целей рендеринга в opengles 3.0

Я хочу реализовать MRT в opengl es 3.0. Таким образом создал фреймбуфер с текстурой в виде вложения GL_COLOR_ATTACHMENT0 типа GL_RGBA32UI. Рендеринг текстурированного изображения GL_RGBA32UI в этом фреймбуфере. Затем чтение данных фреймбуфера в виде текстуры и применение их в качестве текстуры в буфере по умолчанию. (В основном визуализируйте текстуру, используя текстуру INTEGER)

Я пытаюсь использовать один и тот же фрагментный шейдер как для моей настройки FBO, так и для стандартного.

precision highp float;
uniform highp usampler3D    stexture;
in  vec4    out_TexCoord;
uniform highp uint              range;
layout(location = 0) out uvec4 uex_colour;
layout(location = 1) out vec4 ex_colour;
void main(void)
{
    uex_colour = uvec4(texture(stexture, out_TexCoord.xyz));
    ex_colour = vec4(texture(stexture, out_TexCoord.xyz))/(range);
    ex_colour = vec4(vec3(ex_colour.xyz), 1.0);
}

Хотите использовать uex_color для рендеринга в настраиваемый фреймбуфер и ex_color для рендеринга в фреймбуфер по умолчанию.

Пытался использовать glDrawBuffer(1, {GL_COLOR_ATTACHMENT0 }) для моего FBO, но не смог понять, как использовать ex_color для кадрового буфера по умолчанию.


person user1896853    schedule 30.04.2014    source источник


Ответы (1)


Я думаю, вы избавите себя от головной боли, используя два разных шейдера. Допустимые наборы значений для glDrawBuffers в ES 3.0 гораздо более ограничены, чем в полной версии OpenGL.

В частности, в вашем случае с фрагментным шейдером, который вы пытаетесь использовать, то, что вы хотите в заднем буфере, выводится 1. Но для буфера кадра по умолчанию у вас может быть только один буфер отрисовки, который должен быть GL_BACK. Таким образом, вы можете использовать только вывод 0 для рисования заднего буфера.

На самом деле похоже, что вы пытаетесь выполнить рендеринг в текстуру и использовать текстуру в одном и том же проходе рендеринга. Если это так, то это очень плохая идея. Он устанавливает то, что в спецификациях называется «петлей обратной связи рендеринга». Вы можете прочитать подробности, но, как правило, это не сработает. И в любом случае вы не могли бы одновременно выполнять рендеринг в FBO и буфер кадра по умолчанию.

Вам нужно выполнить один проход для рендеринга в FBO для создания текстуры, а затем еще один проход для рендеринга в фреймбуфер по умолчанию, сэмплируя текстуру. Вы будете использовать разные шейдеры для этих двух проходов.

person Reto Koradi    schedule 30.04.2014