Редактировать: см. ответ @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, &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
.
void glNamedFramebufferDrawBuffers()
он должен применяться только к привязанному в данный момент кадровому буферу! 24.05.2021glDrawBuffers
): Для glDrawBuffers будет использоваться объект кадрового буфера, привязанный к привязке GL_DRAW_FRAMEBUFFER 24.05.2021