#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».