gpt4 book ai didi

opengl - 延迟渲染 - 渲染缓冲区与纹理

转载 作者:行者123 更新时间:2023-12-03 15:50:43 26 4
gpt4 key购买 nike

所以,我一直在读这个,我还没有找到结论。有些例子使用纹理作为渲染目标,有些人使用渲染缓冲区,有些人同时使用!

例如,仅使用纹理:

// 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 );

有什么不同?创建纹理、渲染缓冲区然后将一个分配给另一个的意义何在?在您成功地为图像提供纹理后,它的内存被分配了,那么为什么需要将它绑定(bind)到渲染缓冲区呢?
为什么要使用纹理或渲染缓冲区?会有什么优势?

我读过你不能从渲染缓冲区中读取,只能从纹理中读取。那它有什么用呢?

编辑:
所以,我当前的 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 );

这是要走的路吗?
我还是要写相应的着色器...

最佳答案

What's the point of creating a texture, a render buffer, and then assign one to the other?



这不是正在发生的事情。但这没关系,因为第二个示例代码是错误的废话。 glFramebufferTexture2DEXT正在覆盖来自 glFramebufferRenderbufferEXT 的绑定(bind).渲染缓冲区在创建后从未真正使用过。

如果您在某处在线找到该代码,我强烈建议您忽略该来源告诉您的有关 OpenGL 开发的任何内容。尽管我还是建议这样做,因为它在 2016 年使用了“EXT”扩展功能,距核心 FBO 可用已近十年。

I've read that you cannot read from renderbuffer, only texture. Wht's the use of it, then?



这完全是它们的重点:您对不想读取的图像使用渲染缓冲区。这对于延迟渲染没有用,因为您确实想从中读取。

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

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

关于opengl - 延迟渲染 - 渲染缓冲区与纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41182154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com