在vec3中存储一个浮点值

时间:2016-01-23 21:43:27

标签: opengl glsl lwjgl

我正在使用LWJGL中的2D阴影,并且我在3个颜色像素(GL_RGB16)中存储阴影贴图中的距离,但是我只使用16位R通道而其他的未使用,由于浮动精度的损失,导致阴影质量差。所以我正在寻找一种方法来将一个浮点数存储到glsl中的一个vec3中,而不会出现精度损失(并将其解包)。

1 个答案:

答案 0 :(得分:1)

你有两个选择,实际上,你可以使用更高精度的格式(这可能会更好,因为你可以传递一个制服而不是三个)或者你可以使用乘法格式来存储更高精度的数字。

例如,您可以在R(X)组件中包含数字的整数部分,G(Y)组件中的浮点部分和B(Z)组件中的附加乘数。在着色器中,要获得该值,您将执行以下操作:

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

现在,我强烈反对您使用此系统的原因有几个。首先,它必须将高精度值存储到这种格式中然后将其从这种格式恢复到原始值,这在计算上非常昂贵,特别是考虑到你经常这样做(特别是如果你在片段着色器中进行计算) )。其次,这只是一个概念证明,正如我上面所说的,使用更高精度类型并发送单个浮点均匀而不是三分量向量是更好的主意。