我正在使用浮点数来指定纹理坐标,范围在0-1之间。OpenGL喜欢这个范围,我很满意以这种方式指定坐标,但我担心当我开始使用更大的纹理(比如4096或8192像素)时,我可能会开始失去精度。例如,如果我想在一个8192x8192px的纹理中指定一个坐标为(1,1),那么它将映射到
我可以暂时将坐标保持为像素中的整数,但迟早我必须将其转换(可能是在着色器本身)。有没有解决方法,或者这是我应该关注的问题?
将其乘回去,我得到
1/8192=0.0001220703125
。然而,作为浮点数,它似乎评估为0.000122070313
...我担心我的OpenGL着色器不会将其映射到我预期的相同像素。我可以暂时将坐标保持为像素中的整数,但迟早我必须将其转换(可能是在着色器本身)。有没有解决方法,或者这是我应该关注的问题?
将其乘回去,我得到
1.000000004096
,我猜这仍然会被解释为1
?实际上,如果不是整数,OpenGL会进行混合吗?也许不是用“最近邻”,但用“线性”应该可以。1/4096f * 4096 = 1, error = 0
1/8192f * 8192 = 1.000000004096, error = 0.000000004096
1/16384f * 16384 = 1.0000000008192, error = 0.0000000008192
1/32768f * 32768 = 0.9999999991808, error = 0.0000000008192
...
1/1048576f * 1048576 = 0.9999999827968, error = 0.0000000172032
我正在使用Visual Studio的调试器计算浮点数,然后再用计算器将其乘回去。
这里的教训是对于任何合理大小的纹理来说,误差都是可以忽略不计的吗?