Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL FBO返回黑屏 我的OpenGL C++应用程序中的帧缓冲区有点麻烦。没有抛出错误(调用GLCHECKFRAMEBURESTATUS时,我得到GL_FRAMEBUFFER_COMPLETE),但是当我渲染FBO纹理时,我看到的只是一个黑屏。我已经搜索了好几个小时,重复了好几次都没有结果,所以我终于向你们寻求帮助了。以下是所有相关代码。我希望你们能发现一些我疲惫的眼睛看不到的东西。多谢各位_C++_Opengl_Shader_Fbo - Fatal编程技术网

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),但我可能不正确。我在这个问题上纠缠了一段时间。。