浮点数 OpenGL

单精度浮点数在机内占4个字节,用32位二进制描述。

双精度浮点数在机内占8个字节,用64位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.

类型 比特数 有效数字 数值范围 
float 32 6-7 -3.4*10(-38)~3.4*10(38) 
double 64 15-16 -1.7*10(-308)~1.7*10(308) 
long double 128 18-19 -1.2*10(-4932)~1.2*10(4932) 

float类型的字面常量,后面需要加上f或者F来表示是一个单精度浮点数。只所以要这样写,是因为默认的浮点数常量都是double类型。

浮点数运算:对阶,尾数加减,规格化

浮点数转换溢出、或微小差异的积累会导致严重问题。要特别注意。

opengl图形处理函数基本都是浮点数原因:

图形计算用到的很多公式,其中间结果都是有小数的,你如果用整数计算,这些小数都被略掉了,在积累很多步骤以后,最后的结果误差可能会很大。

因为精度问题.
虽然最后表达成像素的时候是整数的形式,但是中间计算使用浮点数可以保证最少的颜色失真.
即使采用24位色,每种颜色也才8位. 所以如果中间计算也使用整数的话,最后的输出是很难看的,会产生明显的色阶.
楼主自己尝试一下对一个像素进行多个ALPHA操作.如果中间值都采用整数,那么每次计算得到的小数部分都将被忽略,而最终得到的结果和采用浮点数计算得到的结果会相去甚远. 
当然,光是一个像素的话,差一点也看不出来,如果是一幅比较精细的画面,相邻的像素之间的这些差异就会变得非常明显了.

3D物体是由N个三角形组成..
那假设用整数来表示三角形的3条边和3个角..
那这个三角形缩小1/3..1/7..边怎么表示? 约等于吗?
或者三角形得一个角偏移(x,y),角度能全部是整数吗?

一句话:浮点数据比整形数据保留了更多的位置信息。

采样生成矢量数据的时候不可能考虑将来光栅的分辨率去生成数据的。采用浮点数据使得数据与光栅无关且最大可能保持原有真实信息。使得未来在更高分辨率的光栅上可以更精确地呈现。

另外,矢量图形系统中大都需要进行二维或者三位坐标系的转换,这里更加需要使用浮点数据,否则误差就大了。

在有就是在光栅化的时候为了反走样需要通过通过亚像素(子像素)的技术来计算灰度或者透明值,一般都是2x2、4x4、8x8的划分一个像素,这使得浮点数据在亚像素上存在意义,否则像素都以1为单位,亚像素也就失去意义了。自然就无法实现反走样效果了。

因为为了提高渲染物体位置精度,从GPU诞生时刻起就专注于大规模使用浮点计算单元。
目前,主流GPU对单精度浮点的处理能力非常强劲,并且可以拥有SIMD机制,可同时对多个单精度浮点数进行操作,这也被称为向量计算。而最近比较先进的GPU则将SIMD改良成了SIMT,使得计算灵活性大大增强。

GPU一般只配有很少的整型处理单元。所以,一般顶点数据都用单精度,而颜色数据可以采用整型。
不同GPU,架构、计算能力都不尽相同。但是对单精度的浮点计算能力都很高,都是在1个周期能处理数对。

经常要平方开方,点乘叉乘的计算,还要sin,cos等三角函数。都用整数,sin,cos不都为0了?前面的多次乘也很用于超过整数的表示范围。

转自:

https://bbs.csdn.net/topics/330141165

https://blog.csdn.net/csshuke/article/details/79118276

https://blog.csdn.net/yongchaocsdn/article/details/56504747

猜你喜欢

转载自blog.csdn.net/lyq_csdn/article/details/83963856