Renderbuffer vs Texture



所以,我一直在阅读有关此内容的信息,但我仍然没有找到结论。有些示例使用纹理作为其渲染目标,有些人使用渲染扣,有些则使用!

例如,仅使用纹理:

// Create the gbuffer textures
glGenTextures(ARRAY_SIZE_IN_ELEMENTS(m_textures), m_textures);
glGenTextures(1, &m_depthTexture);
for (unsigned int i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(m_textures) ; i++) {
    glBindTexture(GL_TEXTURE_2D, m_textures[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0);
}

两者:

glGenRenderbuffersEXT ( 1, &m_diffuseRT );
glBindRenderbufferEXT ( GL_RENDERBUFFER_EXT, m_diffuseRT );
glRenderbufferStorageEXT ( GL_RENDERBUFFER_EXT, GL_RGBA, m_width, m_height );
glFramebufferRenderbufferEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_diffuseRT );
glGenTextures ( 1, &m_diffuseTexture );
glBindTexture ( GL_TEXTURE_2D, m_diffuseTexture );
glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, 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_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
// Attach the texture to the FBO
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_diffuseTexture, 0 );

有什么区别?创建纹理,渲染缓冲区然后将一个分配给另一个纹理的意义是什么?成功提供图像的纹理后,它将其内存分配了,那么为什么需要将其绑定到渲染缓冲区呢?为什么要使用纹理或渲染扣?有什么优点?

我已经读到,您无法从RenderBuffer阅读,只有纹理。然后是它的使用?

编辑:因此,我当前的Gbuffer代码是:

    enum class GBufferTextureType
        {
        Depth = 0,
        Position,
        Diffuse,
        Normal,
        TexCoord
        };

。。。

glGenFramebuffers ( 1, &OpenGLID );
if ( Graphics::GraphicsBackend->CheckError() == false )
    {
    Delete();
    return false;
    }
glBindFramebuffer ( GL_FRAMEBUFFER, OpenGLID );
if ( Graphics::GraphicsBackend->CheckError() == false )
    {
    Delete();
    return false;
    }
uint32_t TextureGLIDs[5];
glGenTextures ( 5, TextureGLIDs );
if ( Graphics::GraphicsBackend->CheckError() == false )
    {
    Delete();
    return false;
    }
// Create the depth texture
glBindTexture ( GL_TEXTURE_2D, TextureGLIDs[ ( int ) GBufferTextureType::Depth] );
glTexImage2D ( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, In_Dimensions.x, In_Dimensions.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL );
glFramebufferTexture2D ( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, TextureGLIDs[ ( int ) GBufferTextureType::Depth], 0 );
// Create the color textures
for ( unsigned cont = 1; cont < 5; ++cont )
    {
    glBindTexture ( GL_TEXTURE_2D, TextureGLIDs[cont] );
    glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGB32F, In_Dimensions.x, In_Dimensions.y, 0, GL_RGB, GL_FLOAT, NULL );
    glFramebufferTexture2D ( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + cont, GL_TEXTURE_2D, TextureGLIDs[cont], 0 );
    }
// Specify draw buffers
GLenum DrawBuffers[4];
for ( unsigned cont = 0; cont < 4; ++cont )
    DrawBuffers[cont] = GL_COLOR_ATTACHMENT0 + cont;
glDrawBuffers ( 4, DrawBuffers );
if ( Graphics::GraphicsBackend->CheckError() == false )
    {
    Delete();
    return false;
    }
GLenum Status = glCheckFramebufferStatus ( GL_FRAMEBUFFER );
if ( Status != GL_FRAMEBUFFER_COMPLETE )
    {
    Delete();
    return false;
    }
Dimensions = In_Dimensions;
// Unbind
glBindFramebuffer ( GL_FRAMEBUFFER, 0 );

这是要走的路吗?我仍然必须写相应的着色器...

创建纹理,渲染缓冲区然后将一个分配给另一个是什么意义?

那不是发生的事情。但这没关系,因为第二个示例代码是错误的。glFramebufferTexture2DEXTglFramebufferRenderbufferEXT覆盖绑定。创建后永远不会实际使用RenderBuffer。

如果您在线发现该代码在某处,我强烈建议您忽略任何有关OpenGL开发的信息。尽管我建议无论如何,因为它使用了2016年 2016 中的" ext"扩展功能,所以自Core FBOS可用以来将近十年。

我已经读到,您无法从RenderBuffer阅读,只有纹理。然后是它的使用?

这完全是其中的重点:您使用renderbuffer进行不想阅读的图像。这对于递延渲染没有用,因为您确实想从它们那里阅读。

但是,想象一下,如果您正在生成场景的反射图像,以后您将在主场景中用作纹理。好吧,要渲染反射场景,您需要一个深度缓冲区。但是,您不会从该深度缓冲区中阅读(无论如何都不是纹理);您需要深度缓冲液进行深度测试。但是您要从之后阅读的唯一图像是颜色图像。

因此,您将使深度缓冲区成为渲染器。这表明实现可以将图像放入任何最有效地用作深度缓冲区的存储空间中,而不必担心读取性能。这可能或可能不会产生性能影响。但至少,它不会比使用纹理慢。

大多数渲染方案需求一个深度和/或模板缓冲区,尽管很少需要从一个模板缓冲区中采样存储在模板缓冲区中的数据着色器。

如果您的Framebuffer没有存储这些数据的位置,并且使用这些片段测试的任何渲染通行证都需要使用适当的图像的框架,则进行深度/模具测试是不可能的。

如果您不想在着色器中使用深度/模板缓冲区数据,则渲染板将很乐意满足固定功能片段测试的存储要求。渲染扣的格式限制少于纹理,,特别是如果我们将此讨论驱逐到多样化。


D3D10引入了对多样采样颜色纹理的支持,但省略了多采样深度纹理;D3D10.1后来解决了该问题,而GL3.0在D3D10的初始设计监督后被确定。

pre-gl3/d3d10.1设计将以GL表现为一个多样采样的框架式对象,允许纹理或renderbuffer颜色附件,但迫使您使用renderbuffer进行深度附件。


渲染扣最终是用于存储的最低通用分母,它们将使您在功能有限的硬件上通过艰难的果酱。您实际上可以 blit 在某些情况下您无法直接吸引纹理中的纹理中存储在纹理中的数据。

到此为止,您可以通过从一个框架挡板到另一个框架来解决一个多样采样的Renderbuffer,将多样采样的呈现纹理分解为单采样的纹理。这是隐式的多样采样,它(WILL)允许您使用标准纹理查找的先前渲染通行证的反敏化结果。不幸的是,在递延阴影中抗氧化是完全无用的 - 您需要 explicit 多示例解决方案。

尽管如此,说渲染布是不可读的是不正确的。从各个方面来看

相关内容

  • 没有找到相关文章

最新更新