OpenGL中的单色渲染到frambuffer对象?

时间:2018-02-11 03:09:33

标签: c++ opengl shader framebuffer

有没有办法在OpenGL中以单色方式渲染帧缓冲区?

我的最终目标是渲染到立方体纹理,以便在我的应用程序中为阴影创建阴影贴图。

根据我的理解,这样做的方法是,对于每个光源,将场景渲染6次(使用相机的6个可能的正交方向)到FBO每个,然后将它们全部添加到立方体贴图

我alrady有着色器渲染一个这样的相机位置的深度图。但是,这些着色器以完整的RGB渲染,对于深度贴图,它比需要的大3倍。有没有办法单色渲染以减少纹理的大小?

1 个答案:

答案 0 :(得分:1)

如何为shadowmap(或cubemap)创建纹理[s]?如果在创建纹理时使用GL_DEPTH_COMPONENT[16|24|32]格式,则纹理将根据需要为单个通道。

查看官方文档:https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexImage2D.xml

<强> GL_DEPTH_COMPONENT

  

每个元素都是一个深度值。                           GL将其转换为浮点,乘以有符号的比例因子                           GL_DEPTH_SCALE,添加签名偏差GL_DEPTH_BIAS,                           并钳位到范围[0,1](参见glPixelTransfer)。

正如您所看到的,它表示每个元素都是SINGLE深度值。

所以如果你使用这样的东西:

 for (i = 0; i < 6; i++)
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
                 0,
                 GL_DEPTH_COMPONENT24,
                 size,
                 size,
                 0,
                 GL_DEPTH_COMPONENT,
                 GL_FLOAT,
                 NULL);

单个元素大小必须是24位(可能是32个填充)。否则,如果将它们存储为RGB [A],则指定深度大小将是荒谬的。

这篇文章还验证了深度纹理是单通道纹理:https://www.opengl.org/discussion_boards/showthread.php/123939-How-is-data-stored-in-GL_DEPTH_COMPONENT24-texture

“我可以使用着色器渲染一个这样的相机位置的深度贴图。然而,这些着色器以完整的RGB渲染,对于深度贴图,它比它需要的大3倍。”

通常,您将场景渲染到阴影贴图以获取深度值(或距离),对吧?那你为什么要渲染为RGB呢?如果你只需要深度值,你不需要为附件着色,因为你不需要编写它们,你只需要写入深度缓冲区(实际上,如果你没有在frag中覆盖它的值,OpenGL本身会这样做)