我正在研究如何在不使用淫秽渲染目标的情况下将基于物理的延迟渲染器所需的所有信息打包到G缓冲区中。

到目前为止,我得到的是4个3部分向量:


和4个单一组件


金属
粗糙度
高度
环境光遮蔽

天真的方法是将单个分量之一与三部分向量之一捆绑到alpha(第四)通道中,这是我目前的研究方向。但是,鉴于四个4通道全精度浮点渲染目标并不小,我知道通常使用半精度甚至更小的表示来提高内存意识。

我要问的是:在不损失质量的前提下,我可以安全地降低精度的组件是多少?

#1 楼

首先,您根本不需要在G缓冲区中的位置。可以从深度缓冲区重新构造像素的位置,知道相机设置和像素的屏幕空间xy位置。这样您就可以摆脱整个缓冲区。

此外,您通常也不需要G缓冲区中的切向量。仅从切线空间转换法线贴图和视差贴图才需要它们。这些操作将在G缓冲区填充过程中完成(当您从要渲染的网格中获得切线时),而G缓冲区仅将法线存储在世界或视图空间中。诸如颜色,粗糙度和金属色之类的值通常只是G缓冲区中的8位值,因为它们来自8位纹理。同样适用于AO。

G缓冲区中也不需要高度,除非您要进行某种取决于它的多遍混合,但是如果确实需要,8位可能也足够了。

将法线存储为16位值而不是8位可以受益。半浮点数还可以,但是16位定点甚至更好,因为它可以在所有方向上提供更均匀的精度(半浮点在轴附近更为精确,并且在轴上会失去一些精度)。此外,您可以使用八面体映射将它们从3个分量减少到2个。

因此,最终,一个最小的G缓冲区可能看起来像:
材料颜色+金属:RGBA8
八面体世界空间法线+粗糙度+ AO:RGBA16

就这样!每个像素只有12个字节。如果最终需要更多8位或16位大小的G缓冲区组件,那将为您提供增长的空间。

评论


$ \ begingroup $
另外,金属度通常是一个二进制值,并且假设您不使用粗糙度梯度(以便查看精度降低的影响),则可以将金属度和粗糙度存储在单个8位通道中(对于金属度,粗糙度为7)。
$ \ endgroup $
– Kostas Anagnostou
17年4月7日在15:33