OpenGL:帧缓冲,不完整的纹理附着

6

我已经搜索了几个小时来解决我的问题。

首先,我有HD 7800系列的amd GPU,也安装了最新的驱动程序。

我正在尝试创建一个帧缓冲类,其中包含我需要的所有帧缓冲函数。看起来我已经让渲染缓冲工作了,但是纹理绘制会导致非常奇怪的错误。

FrameBuffer::FrameBuffer(int width, int height)
{
    createFrameBuffer();
//  createDepthBufferAttachment(width, height); //commented out for testing (THIS WORKS)
    createTextureAttachment(width, height);
//  createDepthTextureAttachment(width, height); //commented out for testing
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
        std::cerr << glCheckFramebufferStatus(GL_FRAMEBUFFER) << "\nFramebuffer failed to generate! 0\n";
    }
    unbindFrameBuffer();


}

FrameBuffer::~FrameBuffer()
{
    if (fbo != NULL)
        glDeleteFramebuffers(1, &fbo);
    if (colorTexture != NULL)
        glDeleteTextures(1, &colorTexture);
    if (depthBuffer != NULL)
        glDeleteRenderbuffers(1, &depthBuffer);
    if (depthTexture != NULL)
        glDeleteTextures(1, &depthTexture);
}

void FrameBuffer::createFrameBuffer(){
    glGenFramebuffers(1, &fbo);

}

void FrameBuffer::createTextureAttachment(int width, int height){
    glGenTextures(1, &colorTexture);
    glBindTexture(GL_TEXTURE_2D, colorTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, GL_RGBA, 0, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
        std::cerr << glCheckFramebufferStatus(GL_FRAMEBUFFER) << "\nFramebuffer failed to generate! 1\n";
    }
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

}
void FrameBuffer::createDepthTextureAttachment(int width, int height){
    glGenTextures(1, &depthTexture);
    glBindTexture(GL_TEXTURE_2D, depthTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, width, height, GL_DEPTH_COMPONENT, 0, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
        std::cerr << glCheckFramebufferStatus(GL_FRAMEBUFFER) << "\nFramebuffer failed to generate! 2\n";
    }
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

}

void FrameBuffer::createDepthBufferAttachment(int width, int height){
    glGenRenderbuffers(1, &depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){
        std::cerr << glCheckFramebufferStatus(GL_FRAMEBUFFER) << "\nFramebuffer failed to generate! 3\n";
    }
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

void FrameBuffer::bindFrameBuffer( int width, int height){
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glViewport(0, 0, width, height);
}

void FrameBuffer::unbindFrameBuffer(){
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, DisplayManager::getWidth(), DisplayManager::getHeight());
}

glCheckFrameBufferStatus在两个检查点都返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。使用createDepthTextureAttachment()也出现了同样的问题。两者似乎都不起作用。

createDepthBufferAttachment()运行良好。

更多信息:实际上我正在向函数中传递宽度和高度,它们都是1024。 我尝试过将GL_RGBA更改为GL_RGB,并尝试使用不同大小的GL_DEPTH_COMPONENT。

目前我打算只使用1个纹理,而不是所有3个函数。

我不知道这是否重要,但已经设置了SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32)。

我也尝试过使用glFramebufferTexture()函数。

提前感谢你!

1个回答

9

您的glTexImage2D()调用中参数的顺序是错误的。看一下第一个参数:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, GL_RGBA, 0, GL_UNSIGNED_BYTE, NULL);

将其与函数定义进行比较:

void glTexImage2D(
    GLenum target,
    GLint level,
    GLint internalFormat,
    GLsizei width,
    GLsizei height,
    GLint border,
    GLenum format,
    GLenum type,
    const GLvoid* data);

您可以看到第6个参数是边框宽度,第7个参数是格式。您把这两个搞反了。正确的调用应该是:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

同样的事情也适用于其他调用。
每当您在使用OpenGL时遇到问题时,我强烈建议您调用glGetError()。它会快速告诉您这些调用中存在错误。

1
天啊,这个错误太蠢了 :d 真的花了我4-5个小时来寻找这个bug。非常感谢你敏锐的眼睛和glGetError()提示! - Trinedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接