Framebuffer Текстура пустая / черная - PullRequest
1 голос
/ 30 марта 2020

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

Буфер генерируется с использованием generateBuffer (normalBuffer, normalMap, GL_RGBA, GL_COLOR_ATTACHMENT0) с использованием метода generateBuffer:

glGenFramebuffers(1, &buffer);

glGenTextures(1, &map);
glBindTexture(GL_TEXTURE_2D, map);
glTexImage2D(GL_TEXTURE_2D, 0, macro, depthWidth, depthHeight, 0, macro, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glBindFramebuffer(GL_FRAMEBUFFER, buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, map, 0);

std::vector<GLenum> drawBuffers = { GL_NONE };

glDrawBuffers(1, drawBuffers.data());
GLenum status2 = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status2 != GL_FRAMEBUFFER_COMPLETE)
{
     std::cout << "incomplete framebuffer object " << status2 << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);

Затем текстуру заполняют данными, используя:

Shader::setActiveProgram(normalShaderProgram);

normalShaderProgram->setMat4("lightSpace", ligthProjection * lightView);

glViewport(0, 0, depthWidth, depthHeight);
glBindFramebuffer(GL_FRAMEBUFFER, normalBuffer);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);

normalShaderProgram->setMat4("model", model);

glBindVertexArray(cubeVAO);
glDrawArrays(GL_TRIANGLES, 0, 36);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

и вершинный шейдер:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
uniform mat4 lightSpace;
uniform mat4 model;
out vec3 color;
void main()
{
gl_Position = lightSpace * vec4(aPos, 1.0);
color = (aNormal * vec3(0.5)) + vec3(0.5);
}

и фрагментный шейдер:

#version 330 core
layout(location = 0) out vec4 FragColor;
in vec3 color;
void main()
{
FragColor = color;
}

Фрагментный шейдер для четырехугольника дисплея:

#version 330 core
out vec4 FragColor;
in vec2 uv;
uniform sampler2D normalMap;
void main()
{
FragColor = texture(normalMap, uv);
}

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

Я уверен, что решение очень простое, и я просто что-то упускаю, но я просто не могу понять свою ошибку.

Заранее спасибо всем, кто ищет и эту проблему, и пытается помочь мне.

1 Ответ

2 голосов
/ 30 марта 2020

Проблема заключается в следующем:

std::vector<GLenum> drawBuffers = { GL_NONE };
glDrawBuffers(1, drawBuffers.data());

Это в основном говорит GL отбрасывать (цветной) вывод вашего фрагментного шейдера. Почему вы устанавливаете glDrawBuffers в GL_NONE, когда собираетесь рендерить цветное вложение?

Получается черный, что для меня абсолютно бессмысленно, так как у меня есть второй кадровый буфер с текстура глубины, которая отлично работает.

Начальная настройка буфера рисования для вновь созданного FBO: {GL_COLOR_ATTACHMENT0}. Приведенный выше код имеет смысл для цели рендеринга только по глубине, поскольку в этом случае нет цветового вложения, и сохранение состояния буфера рисования GL_COLOR_ATTACHMENT0 приведет к состоянию ошибки GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER кадрового буфера.

...