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

Monochrome rendering in OpenGL to frambuffer object?

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

我的最终目标是渲染到 Cubic 纹理以创建用于在我的应用程序中着色的阴影贴图。

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

我已经有了渲染一个这样的相机位置的深度图的着色器。然而,这些着色器以完整的 RGB 渲染,对于深度图,它比需要的大 3 倍。有没有一种方法可以单色渲染以减小纹理的大小?

如何为阴影贴图(或立方体贴图)创建纹理?如果您在创建纹理时使用 GL_DEPTH_COMPONENT[16|24|32] 格式,那么纹理将是您想要的单通道。

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

GL_DEPTH_COMPONENT

Each element is a single depth value. The GL converts it to floating point, multiplies by the signed scale factor GL_DEPTH_SCALE, adds the signed bias GL_DEPTH_BIAS, and clamps to the range [0,1] (see glPixelTransfer).

如您所见,它表示每个元素都是单个深度值。

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

 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],指定深度大小将是荒谬的。

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

"I alrady have the shaders that render the depth map for one such camera position. However, these shaders render in full RGB, which, for a depth map, is 3 times bigger than it needs to be."

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