当渲染我的帧缓冲区附加纹理到显示四边形时,它变成黑色,这对我来说完全没有意义,因为我有第二个帧缓冲区和深度纹理,它工作得很好。此外,当在屏幕上显示渲染的输出而不是将其存储在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);
}显示四边形的顶点着色器与深度纹理的顶点着色器完全相同,效果非常好,因此这不会是失败的部分。
我很确定,解决方案很简单,我只是忽略了一些东西,但我就是找不到我的错误。
提前感谢大家的关注和这个问题,并试图帮助我。
发布于 2020-03-30 20:16:49
问题出在这里:
向量std::
drawBuffers ={ GL_NONE };glDrawBuffers(1,drawBuffers.data());
这基本上告诉GL丢弃片段着色器的(颜色)输出。当您要渲染到颜色附件时,为什么要将glDrawBuffers设置为GL_NONE?
它变成了黑色,这对我来说完全没有意义,因为我有第二个带深度纹理的帧缓冲区,它工作得很好。
新创建的FBO的初始绘制缓冲区设置为{GL_COLOR_ATTACHMENT0}。上面的代码对于仅深度渲染目标很有意义,因为在这种情况下没有颜色附加,并且保持GL_COLOR_ATTACHMENT0绘制缓冲区状态将导致GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER帧缓冲区错误状态。
https://stackoverflow.com/questions/60922339
复制相似问题