OpenGL FBO返回黑屏 我的OpenGL C++应用程序中的帧缓冲区有点麻烦。没有抛出错误(调用GLCHECKFRAMEBURESTATUS时,我得到GL_FRAMEBUFFER_COMPLETE),但是当我渲染FBO纹理时,我看到的只是一个黑屏。我已经搜索了好几个小时,重复了好几次都没有结果,所以我终于向你们寻求帮助了。以下是所有相关代码。我希望你们能发现一些我疲惫的眼睛看不到的东西。多谢各位
初始化代码:OpenGL FBO返回黑屏 我的OpenGL C++应用程序中的帧缓冲区有点麻烦。没有抛出错误(调用GLCHECKFRAMEBURESTATUS时,我得到GL_FRAMEBUFFER_COMPLETE),但是当我渲染FBO纹理时,我看到的只是一个黑屏。我已经搜索了好几个小时,重复了好几次都没有结果,所以我终于向你们寻求帮助了。以下是所有相关代码。我希望你们能发现一些我疲惫的眼睛看不到的东西。多谢各位,c++,opengl,shader,fbo,C++,Opengl,Shader,Fbo,初始化代码: glGenFramebuffers(1, &m_fbo); glBindFramebuffer(GL_FRAMEBUFFER, m_fbo); m_texture = new Texture(width, height); //glBindTexture(GL_TEXTURE_2D, m_texture->GetID()); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTUR
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
m_texture = new Texture(width, height);
//glBindTexture(GL_TEXTURE_2D, m_texture->GetID());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture->GetID(), 0);
glGenRenderbuffers(1, &m_depth);
glBindRenderbuffer(GL_RENDERBUFFER, m_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depth);
GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
CheckError(status);
纹理初始化代码:
unsigned char* imageData = fileName != "" ? stbi_load(fileName.c_str(), &width, &height, &numComponents, 4) : 0;
if (imageData == NULL && fileName != "")
std::cerr << "Texture loading failed for texture: " << fileName << std::endl;
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glBindTexture(GL_TEXTURE_2D, 0);
if (fileName != "") stbi_image_free(imageData);
帧缓冲区绑定代码:
glActiveTexture(GL_TEXTURE0 + unit);
glBindTexture(GL_TEXTURE_2D, m_texture);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glViewport(0, 0, m_width, m_height);
主要代码:
fbo.BindFramebuffer();
display.Clear(1.0f, 0.0f, 0.0f, 1.0f);
fboShader.Bind();
fboShader.Update(transform2, camera);
texture.Bind(0);
mesh2.Draw();
display.Bind();
display.Clear(0.0f, 0.0f, 0.9f, 1.0f);
shader.Bind();
shader.Update(transform, camera);
fbo.BindFramebufferTexture(0);
mesh3.Draw();
FBO着色器代码
片段:
#version 330
varying vec2 texCoord0;
varying vec3 normal0;
varying vec3 position0;
uniform sampler2D diffuse;
out vec4 outputColor;
void main()
{
outputColor = vec4(normal0, 1.0);
//gl_FragColor = vec4(normal0, 1.0);
}
顶点:
#version 330
attribute vec3 position;
attribute vec2 texCoord;
attribute vec3 normal;
varying vec2 texCoord0;
varying vec3 normal0;
varying vec3 position0;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(position, 1.0);
texCoord0 = texCoord;
normal0 = (transform * vec4(normal, 0.0)).xyz;
position0 = gl_Position.xyz;
}
我应该看到的是一个长方体(mesh3),上面有一个法线颜色的猴头(mesh2)和红色背景,但我得到的只是黑色。我真的很感激任何帮助 很难说,因为有相当多的代码,但不完全清楚它们是如何连接的,我们也看不到所有的代码。例如,
display.Clear()
做什么?它会删除颜色和深度缓冲区吗?您的着色器正在编译吗?它们不应该这样做,因为它们将被编译为基于#version 330
的核心概要文件着色器,但它们与核心概要文件不兼容(需要输入
和输出
,而不是属性
和变化
)。如果我将版本更改为120或其他版本,只需写信给gl_FragColor就足够了吗?我不知道为什么它不会,但我见过的所有教程都使用out变量。Clear函数只是清除深度和颜色缓冲区,将glClearColor设置为传入的值。确保FBO纹理在绘制到FBO时未绑定到纹理单元。遗憾的是,已经检查了这一点,但这不起作用。现在我真的不知道该怎么办。如果调用glFramebufferTexture2D时FBO纹理未绑定,是否有问题?因为如果纹理被绑定(glBindTexture)并且我调用它,我会得到一个GL\u帧缓冲区\u不完整的\u附件。据我所知,在我可以使用glFramebufferTexture2D之前,我应该使用glBindTexture(GL_TEXTURE_2D,0),但我可能不正确。我在这个问题上纠缠了一段时间。。