2016-01-23 58 views
0

我正在处理LWJGL中的2D阴影,并且我在3个彩色像素(GL_RGB16)中的阴影贴图中存储了距离,但是我只使用16位R通道,剩下的只剩下一个未使用,由于浮点精度的损失导致阴影质量不佳。所以我正在寻找一种方法来将一个float存储到glsl中的一个vec3中,而不会丢失精确度(并将其解包)。在vec3中存储一个浮点值

+4

为什么不使用精度更高的格式,比如'GL_R32F'?这将占用更少的空间,并为您提供完整的浮点精度。 –

回答

1

您有两种选择,实际上,您可以使用更高精度的格式(这可能会好得多,因为您可以传递一个统一而不是三个),或者可以使用乘法格式来存储更高精度的数字。例如,您可以将R(X)组件中的数字的整数部分,G(Y)组件中的浮点部分以及B(Z)组件中的附加乘数组成一个浮点数部分。在着色器中,要获取该值,您将执行以下操作:

float distance = (shadow.r + shadow.g) * shadow.b; 

现在,我强烈建议您不要使用此系统,原因有几个。首先,它的计算量非常大,必须将高精度值存储到此格式中,然后将其从此格式转换回原始值,尤其是考虑到您会经常这样做(特别是如果在片段着色器中进行计算)。其次,这仅仅是一个概念证明,正如我上面所说的,使用更高精度的类型会更好,并发送一个单一的浮点数而不是三个分量向量。