OpenGL纹理坐标和小浮点数的精度

时间:2012-02-14 03:34:54

标签: opengl floating-point precision

我正在使用浮点数来指定纹理坐标,范围为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的调试器计算浮点数,然后将其与计算器相乘)

这里的教训是,对于任何合理大小的纹理,错误都可以忽略不计吗?

1 个答案:

答案 0 :(得分:3)

  

这似乎评估为0.000122070313作为浮点数...我担心我的OpenGL着色器不会将其映射到我想要的相同像素。

你不应该担心。浮点称为浮动点,因为小数浮动。无论浮子有多大或多小,你的尾数都会得到~7位数的精度。

浮点数不存储为0.000122070313;它存储为1.22070313x10 ^ -4。尾数是1.22070313,指数是-4。如果指数是-8,那么你将具有相同的精度。

具有单精度浮点数的指数可以降至+或--~38。也就是说,你可以在尾数的十进制和第一个非零数字之间有 38 zeros

所以不,你不应该担心。

唯一值得关注的是插值的精度和纹理提取的精度。但这些与您存储纹理坐标的数据精度无关。