при рендеринге текстуры, прикрепленной к моему кадровому буферу, к экрану квадратора, он становится черным, что для меня абсолютно бессмысленно, так как у меня есть второй кадровый буфер с текстурой глубины, который прекрасно работает. Кроме того, при отображении отображенного вывода на экране вместо его сохранения в 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);
}
Вершинный шейдер для четырехъядерного дисплея точно такой же, как и для текстуры глубины, которая работает отлично, так что это не может быть ошибкой.
Я уверен, что решение очень простое, и я просто что-то упускаю, но я просто не могу понять свою ошибку.
Заранее спасибо всем, кто ищет и эту проблему, и пытается помочь мне.