gpt4 book ai didi

OpenGL纹理坐标和小 float 的精度

转载 作者:行者123 更新时间:2023-12-02 03:38:24 25 4
gpt4 key购买 nike

我使用浮点来指定纹理坐标,范围为 0-1。 OpenGL 喜欢这个范围内的东西,我可以很好地以这种方式指定坐标,但我担心当我开始使用更大的纹理(例如 4096 或 8192 像素)时,我可能会开始失去精度。例如,如果我想在 8192x8192px 纹理中指定坐标 (1,1),它将映射到 1/8192=0.0001220703125。不过,这似乎将 0.000122070313 计算为 float ...我担心我的 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 的调试器来计算 float ,然后用计算器将其相乘)

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

最佳答案

That seems to evaluate to 0.000122070313 as a float though... I'm concerned that my OpenGL shader won't map that to the same pixel I intended.

你不应该担心。浮点之所以称为浮点,是因为小数 float 。无论 float 有多大或多小,尾数的精度都约为 7 位。

float 不存储为 0.000122070313;它存储为 1.22070313x10^-4。尾数为1.22070313,指数为-4。如果指数为 -8,则将具有相同精度。

使用单精度 float 时,您的指数可以降至 + 或 - ~38。也就是说,小数点和尾数的第一个非零数字之间可以有 38 个零

所以不,你不应该担心。

您唯一应该关心的是插值的精度和纹理获取的精度。但这些与您存储纹理坐标的数据的精度无关。

关于OpenGL纹理坐标和小 float 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9271342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com