Как привязать GL_TEXTURE_2D_ARRAY к буферу кадров в GL_COLOR_ATTACHMENT1?

#c #opengl #glsl #shader

Вопрос:

Редактировать : смотрите ответ @Rabbid76, вопрос на самом деле не был связан с GL_TEXTURE_2D_ARRAY, только с активацией цветового вложения буфера кадров!

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

 glGenTexture(1, tex);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA32F, x, y, 2);

glGenFramebuffers(1, amp;FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0, 0);
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, tex, 0, 1);
 

фрагмент шейдера, который пишет :

 #version 330

layout(location = 0) out vec4 col1;
layout(location = 1) out vec4 col2;

int main()
{
    col1 = vec4(1.0);
    col2 = vec4(2.0);
}
 

другой шейдер, использующий результат :

 #version 330 core

uniform sampler2DArray tex;

in vec2 Coord;

int main()
{
    vec4 val = texture(tex, vec3(Coord, 0));
    val  = texture(tex, vec3(Coord, 1));
}
 

Проблема в том, что col1 это хорошо написано layout 0 (независимо от слоя текстуры, glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texDefo, 0, 1); тоже работает), но я не могу писать в layout 1 ( GL_COLOR_ATTACHMENT1 ).
Я что-то здесь упускаю ?

Обширные испытания :

Судя по тому, до чего я мог бы сузить круг, это действительно выглядит layout(location = 1) не так, как я ожидал. С помощью предоставленного кода я получаю

  • val = col1, когда layout(location = 0) out vec4 col1;
  • val = col2, когда layout(location = 0) out vec4 col2; оба независимо от того , какой слой текстуры я привязал GL_COLOR_ATTACHMENTi , т. Е. Оба слоя, похоже, работают GL_TEXTURE_2D_ARRAY .

Ответ №1:

Вам необходимо указать буферы, в которые будут втягиваться с помощью glDrawBuffers :

 GLenum drawBuffers[]{ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, drawBuffers);
 

Комментарии:

1. Спасибо! Мне еще многое нужно узнать об OpenGL, так что извините, это похоже на ошибку новичка… Применимо ли это только к связанному буферу кадров или ко всем буферам кадров/графическому конвейеру ? Редактировать : из-за существования void glNamedFramebufferDrawBuffers() он должен применяться только к текущему буферу кадров!

2. @startresse Со страницы вики ( glDrawBuffers ): «Для glDrawBuffers будет использоваться объект framebuffer, привязанный к привязке GL_DRAW_FRAMEBUFFER».