我正在研究如何将基于物理的延迟渲染器所需的所有信息打包到G-缓冲区中,而不使用大量的渲染目标。
到目前为止,我得到的是4个3部分的向量:
和4个单组分
一种天真的方法是将单个组件中的一个绑定到alpha (第四个)通道中,其中一个由3部分组成,这是我目前的研究方向。然而,考虑到四个4通道的全精度浮点渲染目标并不小,我理解使用一半精度甚至更小的表示来提高内存意识是很常见的。
我想问的是:我可以在不损失质量的情况下安全地降低精度,减少多少?
发布于 2017-04-06 23:22:46
首先,您根本不需要在G-缓冲区中的位置。像素的位置可以是从深度缓冲区重建,知道相机的设置和像素的屏幕空间xy位置。这样你就可以摆脱整个缓冲区了。
另外,你通常也不需要G-缓冲区中的切线向量。它们仅用于从切线空间转换法线映射和视差映射;这将在G-缓冲区填充传递(当您从正在呈现的网格中有切线时)完成,而G-缓冲区将只存储世界或视图空间中的法线。
材料的性质,如颜色,粗糙度和金属通常只是8位值在G-缓冲器,因为它们是来源于8位纹理。AO也一样。
高度也不需要在G-缓冲区,除非你要做某种多通混合取决于它,但如果你确实需要它,8位可能是足够的。
法线可以从存储为16位值而不是8位值中受益。半浮子是可以的,但16位定点更好,因为它给你更均匀的精度跨越所有的方向(半浮动是更精确的轴线附近,失去一些精度远离它们)。此外,您可以使用八面体映射将它们从3个组件减少到2个。
因此,在一天结束时,最小的G缓冲区可能看起来是:
仅此而已!每像素只有12个字节。
或者,您可以为法线使用一个RG16缓冲区,并将粗糙度+ AO移动到一个单独的8位缓冲区中。如果你最终需要更多的8位或16位大小的G缓冲组件,这将给你一些增长的空间。
https://computergraphics.stackexchange.com/questions/4969
复制相似问题