到目前为止,我得到的是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