我正在学习使用OpenGL,我很惊讶颜色似乎总是被定义为vec4包含4个单精度float点数的结构.我很惊讶,因为如果要复制到图形内存的内存大小是一个问题(这就是为什么索引存在顶点着色器),每种颜色的大小是:
4 x 32 = 128 bits or 16 bytes
Run Code Online (Sandbox Code Playgroud)
当定义32位颜色所需的全部是32位(4字节)时!为什么不将ARGB颜色通道定义为字节呢?
颜色似乎总是被定义为包含4个单精度浮点数的vec4结构
第一:事实并非如此.加载纹理时,请尝试使用其中一种大小的格式作为内部格式.例如,GL_RGBA8是一种标准化格式,每通道8位.GL_RGBA16F是每通道16位浮点格式.有很多.
正如您所说,这种变化是出于内存原因提供的,但也可用于算法选择.例如,您可以使用纹理视图将单通道整数纹理读取为4字节四通道纹理.另一个例子,对于使用64位原子的单遍深度剥离,您可以将浮点深度缓冲区视为原子整数缓冲区.
至于顶点数据,您可以再次选择.API为您的数据提供了不同的步幅和大小.但是在内部,格式化几乎总是在着色器运行之前转换为浮点.
为什么?因为所有数据都是由浮点处理器处理的.你所做的一切 - 混合,纹理调制,BRDF调制等 - 都是以浮点完成的.这可以; 渲染通常由片段着色器纹理访问绑定,因此浮点计算相对自由.