首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Framebuffer纹理为空/黑色

Framebuffer纹理为空/黑色
EN

Stack Overflow用户
提问于 2020-03-30 08:06:38
回答 1查看 442关注 0票数 1

当渲染我的帧缓冲区附加纹理到显示四边形时,它变成黑色,这对我来说完全没有意义,因为我有第二个帧缓冲区和深度纹理,它工作得很好。此外,当在屏幕上显示渲染的输出而不是将其存储在FBO中时,它会按照应该的方式进行渲染,并且GL_FRAMEBUFFER_COMPLETE和glGetError也不会返回错误。

缓冲区是使用generateBuffer(normalBuffer,normalMap,GL_RGBA,GL_COLOR_ATTACHMENT0)通过generateBuffer方法生成的:

代码语言:javascript
复制
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);

然后使用以下命令使用数据填充纹理:

代码语言:javascript
复制
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);

和顶点着色器:

代码语言:javascript
复制
#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);
}

和片段着色器:

代码语言:javascript
复制
#version 330 core
layout(location = 0) out vec4 FragColor;
in vec3 color;
void main()
{
FragColor = color;
}

显示四边形的片段着色器为:

代码语言:javascript
复制
#version 330 core
out vec4 FragColor;
in vec2 uv;
uniform sampler2D normalMap;
void main()
{
FragColor = texture(normalMap, uv);
}

显示四边形的顶点着色器与深度纹理的顶点着色器完全相同,效果非常好,因此这不会是失败的部分。

我很确定,解决方案很简单,我只是忽略了一些东西,但我就是找不到我的错误。

提前感谢大家的关注和这个问题,并试图帮助我。

EN

回答 1

Stack Overflow用户

发布于 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帧缓冲区错误状态。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60922339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档