将浮点数映射到整数屏坐标的精度

时间:2014-12-04 03:51:18

标签: opengl

在OpenGL中,顶点在NDC中指定在-1.0和1.0范围之间,然后映射到实际屏幕。但是,如果屏幕分辨率非常大,那么在这个有限的浮点值范围内无法指定屏幕上的确切像素位置是不可能的?

那么,从数学角度来说,屏幕分辨率到底有多大?

2 个答案:

答案 0 :(得分:2)

标准(IEEE 754)32位浮点数在尾数中具有24位精度。存储了23位,加上隐式前导1.由于我们在这里查看-1.0到1.0的范围,我们还可以在估计精度时包含符号位。这样可以提供25位精度。

25位精度足以覆盖2 ^ 25个值。 2 ^ 25 = 33,554,432。因此,使用浮点精度,我们可以处理大约33,554,432 x 33,554,432像素的分辨率。我想我们一段时间都安全了!

答案 1 :(得分:2)

通常,用于栅格化的坐标根本不是浮点数。

它们是固定点,为子像素精度保留了一些位(你绝对需要这个,因为三角形之类的像素覆盖是基于与像素中心的距离)。

Pixel Coverage

您提供的子像素精度确实取决于GL_MAX_VIEWPORT_DIMS的值。但是如果GL_MAX_VIEWPORT_DIMS不存在,那么可以肯定的是,使用浮点像素坐标是有意义的,因为你需要支持一个巨大的(可能是未知的)坐标范围。

在最小的OpenGL实现中,必须有4位的子像素精度(GL_SUBPIXEL_BITS),所以如果你的GPU使用16位的光栅坐标会给你12位(整数)+ 4位(小数)分布在GL_MAX_VIEWPORT_DIMS上(对于12.4定点,该值可能 4096 )。这样的实现会将整数坐标限制在[ 0 4095 ]范围内,并将每个整数坐标分成16个子像素位置。