有没有办法在OpenGL中以单色方式渲染帧缓冲区?
我的最终目标是渲染到立方体纹理,以便在我的应用程序中为阴影创建阴影贴图。
根据我的理解,这样做的方法是,对于每个光源,将场景渲染6次(使用相机的6个可能的正交方向)到FBO每个,然后将它们全部添加到立方体贴图
我alrady有着色器渲染一个这样的相机位置的深度图。但是,这些着色器以完整的RGB渲染,对于深度贴图,它比需要的大3倍。有没有办法单色渲染以减少纹理的大小?
答案 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本身会这样做)