像素矩形 Pixel Rectangles
可以使用TexImage*D
(参见第8.5节)向GL指定颜色、深度和某些其他值的矩形。这些命令的操作和参数中的一些与ReadPixels
(用于从帧缓冲区获取像素值)共享;然而,关于ReadPixels
的讨论被推迟到第9章,在详细讨论帧缓冲区之后。尽管如此,我们在本节中指出,与这些命令相关的参数和状态也与ReadPixels
相关。
许多参数控制了缓冲区对象或客户端内存中像素的编码(用于读取和写入),以及像素在放置到帧缓冲区中之前(用于读取、写入和复制)或从帧缓冲区中读取后的处理方式。这些参数是通过PixelStore*
来设置的。
像素存储模式和像素缓冲对象 Pixel Storage Modes and Pixel Buffer Objects
像素存储模式影响当TexImage*D
、TexSubImage*D
、CompressedTexImage*D
、CompressedTexSubImage*D
和ReadPixels
等命令被调用时的操作。像素存储模式通过以下函数进行设置:
void glPixelStore{if}( enum pname, T param );
其中,pname
是一个表示要设置的参数的符号常量,param
是要设置的值,见下表。
数据转换按照第2.2.1节中指定的规则执行。
除了将像素数据存储在客户端内存中,像素数据还可以存储在缓冲区对象中(在第6节中描述)。当前的像素解压缩和打包缓冲区对象分别由PIXEL_UNPACK_BUFFER
和PIXEL_PACK_BUFFER
目标指定。
初始状态下,对于PIXEL_UNPACK_BUFFER
,绑定为零,表示像素图像规范命令(如TexImage*D
)从客户端内存指针参数中获取像素。然而,如果绑定了非零缓冲区对象作为当前的像素解压缩缓冲区,那么指针参数将被视为指向指定缓冲区对象的偏移量。
Parameter Name | Type | Initial Value | Valid Range |
---|---|---|---|
UNPACK_SWAP_BYTES | boolean | FALSE | TRUE / FALSE |
UNPACK_LSB_FIRST | boolean | FALSE | TRUE / FALSE |
UNPACK_ROW_LENGTH | integer | 0 | [0, ∞) |
UNPACK_SKIP_ROWS | integer | 0 | [0, ∞) |
UNPACK_SKIP_PIXELS | integer | 0 | [0, ∞) |
UNPACK_ALIGNMENT | integer | 4 | 1,2,4,8 |
UNPACK_IMAGE_HEIGHT | integer | 0 | [0, ∞) |
UNPACK_SKIP_IMAGES | integer | 0 | [0, ∞) |
UNPACK_COMPRESSED_BLOCK_WIDTH | integer | 0 | [0, ∞) |
UNPACK_COMPRESSED_BLOCK_HEIGHT | integer | 0 | [0, ∞) |
UNPACK_COMPRESSED_BLOCK_DEPTH | integer | 0 | [0, ∞) |
UNPACK_COMPRESSED_BLOCK_SIZE | integer | 0 | [0, ∞) |
Table 8.1 PixelStore* parameters pertaining to one or more of TexImage*D, TexSubImage*D, CompressedTexImage*D and CompressedTexSubImage*D
像素矩形的传输 Transfer of Pixel Rectangles
缓冲对象或客户端内存中编码的像素的传输过程在 Figure 8.1
中有详细说明。我们将按照发生的顺序描述此过程的各个阶段。
接受或返回像素矩形的命令会采用以下参数(以及针对其特定功能的其他附加参数):
format
是一个符号常量,表示内存中值所代表的内容。width
和height
分别是待传输像素矩形的宽度和高度。data
指向要绘制的数据。这些数据用type
指定的多种 GL 数据类型之一来表示。type
指定的类型令牌值与它们表示的 GL 数据类型之间的对应关系在Table 8.2
中给出。- 不是所有的
format
和type
组合都是有效的。
下面将进一步讨论对 format
和 type
值组合的有效性的一些额外限制。特定命令可能还会施加额外的约束条件。
- byte, short, int, float, or packed pixel component data stream
- Unpack (Pixel Storage Operations)
- Convert to Float (Pixel Storage Operations)
- Expansion to RGBA
- RGBA pixel data out
Figure 8.1. Transfer of pixel rectangles to the GL. Output is RGBA pixels. Depth and stencil pixel paths are not shown
type Parameter Token Name | Corresponding GL Data Type | Special Interpretation | Floating Point |
---|---|---|---|
UNSIGNED_BYTE | ubyte | No | No |
BYTE | byte | No | No |
UNSIGNED_SHORT | ushort | No | No |
SHORT | short | No | No |
UNSIGNED_INT | uint | No | No |
INT | int | No | No |
HALF_FLOAT | half | No | Yes |
FLOAT | float | No | Yes |
UNSIGNED_BYTE_3_3_2 | ubyte | Yes | No |
UNSIGNED_BYTE_2_3_3_REV | ubyte | Yes | No |
UNSIGNED_SHORT_5_6_5 | ushort | Yes | No |
UNSIGNED_SHORT_5_6_5_REV | ushort | Yes | No |
UNSIGNED_SHORT_4_4_4_4 | ushort | Yes | No |
UNSIGNED_SHORT_4_4_4_4_REV | ushort | Yes | No |
UNSIGNED_SHORT_5_5_5_1 | ushort | Yes | No |
UNSIGNED_SHORT_1_5_5_5_REV | ushort | Yes | No |
UNSIGNED_INT_8_8_8_8 | uint | Yes | No |
UNSIGNED_INT_8_8_8_8_REV | uint | Yes | No |
UNSIGNED_INT_10_10_10_2 | uint | Yes | No |
UNSIGNED_INT_2_10_10_10_REV | uint | Yes | No |
UNSIGNED_INT_24_8 | uint | Yes | No |
UNSIGNED_INT_10F_11F_11F_REV | uint | Yes | Yes |
UNSIGNED_INT_5_9_9_9_REV | uint | Yes | Yes |
FLOAT_32_UNSIGNED_INT_24_8_REV | n/a | Yes | No |
Table 8.2 Pixel data type parameter values and the corresponding GL data types. Refer to table 2.2 for definitions of GL data types. Special interpretations are described in section 8.4.4.2. Floating-point types are incompatible with INTEGER formats as described above
Format Name | Element Meaning and Order | Target Buffer |
---|---|---|
STENCIL_INDEX | Stencil Index | Stencil |
DEPTH_COMPONENT | Depth | Depth |
DEPTH_STENCIL | Depth and Stencil Index | Depth and Stencil |
RED | R | Color |
GREEN | G | Color |
BLUE | B | Color |
RG | R, G | Color |
RGB | R, G, B | Color |
RGBA | R, G, B, A | Color |
BGR | B, G, R | Color |
BGRA | B, G, R, A | Color |
RED_INTEGER | iR | Color |
GREEN_INTEGER | iG | Color |
BLUE_INTEGER | iB | Color |
RG_INTEGER | iR, iG | Color |
RGB_INTEGER | iR, iG, iB | Color |
RGBA_INTEGER | iR, iG, iB, iA | Color |
BGR_INTEGER | iB, iG, iR | Color |
BGRA_INTEGER | iB, iG, iR, iA | Color |
Table 8.3: Pixel data formats. The second column gives a description of and the number and order of elements in a group. Unless specified as an index, formats yield components. Components are floating-point unless prefixed with the letter ’i’, which indicates they are integer
Element Size | Default Bit Ordering | Modified Bit Ordering |
---|---|---|
8 bit | [7…0] | [7…0] |
16 bit | [15…0] | [7…0] [15…8] |
32 bit | [31…0] | [7…0] [15…8] [23…16] [31…24 |
Table 8.4: Bit ordering modification of elements when UNPACK_SWAP_BYTES is enabled. These reorderings are defined only when GL data type ubyte has 8 bits,and then only for GL data types with 8, 16, or 32 bits. Bit 0 is the least significant.
type Parameter Token Name | GL Data Type | Number of Components | Matching Pixel Formats |
---|---|---|---|
UNSIGNED_BYTE_3_3_2 | ubyte | 3 | RGB, RGB_INTEGER |
UNSIGNED_BYTE_2_3_3_REV | ubyte | 3 | RGB, RGB_INTEGER |
UNSIGNED_SHORT_5_6_5 | ushort | 3 | RGB, RGB_INTEGER |
UNSIGNED_SHORT_5_6_5_REV | ushort | 3 | RGB, RGB_INTEGER |
UNSIGNED_SHORT_4_4_4_4 | ushort | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_SHORT_4_4_4_4_REV | ushort | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_SHORT_5_5_5_1 | ushort | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_SHORT_1_5_5_5_REV | ushort | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_INT_8_8_8_8 | uint | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_INT_8_8_8_8_REV | uint | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_INT_10_10_10_2 | uint | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_INT_2_10_10_10_REV | uint | 4 | RGBA, BGRA, RGBA_INTEGER, BGRA_INTEGER |
UNSIGNED_INT_24_8 | uint | 2 | DEPTH_STENCIL |
UNSIGNED_INT_10F_11F_11F_REV | uint | 3 | RGB |
UNSIGNED_INT_5_9_9_9_REV | uint | 4 | RGB |
FLOAT_32_UNSIGNED_INT_24_8_REV | n/a | 2 | DEPTH_STENCIL |
Table 8.5: Packed pixel formats
拆包 Unpacking
数据从当前绑定的像素解包缓冲区或客户端内存中作为一系列有符号或无符号字节(GL 数据类型 byte 和 ubyte)、有符号或无符号短整数(GL 数据类型 short 和 ushort)、有符号或无符号整数(GL 数据类型 int 和 uint)或浮点值(GL 数据类型 half 和 float)获取。这些元素根据格式分组为一组包含一个、两个、三个或四个值的集合,形成一个组。Table 8.3
总结了从内存中获取的组的格式;它还指出了那些产生索引的格式以及那些产生浮点或整数分量的格式。
如果绑定了像素解包缓冲区(由非零值的 PIXEL_UNPACK_BUFFER_BINDING
指示),则数据是像素解包缓冲区中的偏移量,并且像素相对于此偏移量从缓冲区解包;否则,数据是指向客户端内存的指针,并且像素相对于指针从客户端内存解包。
默认情况下,每个 GL 数据类型的值的解释方式与客户端的 GL 绑定语言中指定的方式相同。然而,如果启用了 UNPACK_SWAP_BYTES
,则值将根据Table 8.4
中修改的位顺序进行解释。修改后的位顺序仅在 GL 数据类型 ubyte 具有八位时定义,然后对于每个特定的 GL 数据类型,仅当该类型用 8、16 或 32 位表示时才定义。
内存中的组被视为按矩形排列。该矩形由一系列行组成,其中第一行的第一组的第一个元素由 data
指向。如果 UNPACK_ROW_LENGTH
的值为零,则一行中的组数为 width
;否则,组数为 UNPACK_ROW_LENGTH
的值。如果 p
表示内存中第一行的第一个元素的位置,则第 N
行的第一个元素由以下方式指示:
p + Nk (8.1)
其中 N
是行号(从零开始计数),k 定义为:
if (s ≥ a) k = nl
else
k = a/s * ceil(snl/a)
其中 n
是组中的元素数,l
是行中的组数,a
是 UNPACK_ALIGNMENT
的值,s
是以 GL ubytes
为单位的元素大小。如果每个元素的位数不是 GL ubyte
的位数的1、2、4或8倍,则对于所有 a 的值都有 k = nl。
存在一种机制,用于从较大的包含矩形中选择子矩形的组。该机制依赖于三个整数参数:UNPACK_ROW_LENGTH
、UNPACK_SKIP_ROWS
和 UNPACK_SKIP_PIXELS
。在从内存获取第一组之前,数据指针将按以下方式前进:( UNPACK_SKIP_PIXELS ) n + ( UNPACK_SKIP_ROWS ) k 个元素。然后,从内存中获取宽度组的连续元素(不推进指针),之后指针前进 k
个元素。通过这种方式获取 height 组宽度组的值。
特别解释 Special Interpretations
与表8.5中的类型匹配的类型是一种特殊情况,其中每个组的所有组件都被打包成一个单独的无符号字节、无符号短整数或无符号整数,具体取决于类型。如果类型是FLOAT_32_UNSIGNED_INT_24_8_REV
,则每个组的组件都包含在两个32位字中;第一个字包含浮点组件,第二个字包含一个打包的24位未使用字段,后跟一个8位索引。每个打包像素中的组件数量由类型确定,并且必须与格式参数指定的每组组件数量相匹配,如Table 8.5
所列。
通常情况下,分量按照从高位到低位的顺序打包,即第一个分量位于位域的最高有效位,后续分量依次占据越来越低的有效位。那些以"_REV"
结尾的类型标记名称表示将分量打包顺序反转为从最低到最高有效位。
UNSIGNED_INT_10F_11F_11F_REV
与 UNSIGNED_INT_5_9_9_9_REV
是特例,前者各位被解释为float,后者5是指数(color * 2 ^ ( exp - B - N)): B = 15(指数偏差)和N = 9(尾数位数)。
转换为浮点数 Conversion to floating-point
这一步仅适用于浮点组件的组。它不适用于索引或整数组件。对于包含组件和索引的组,如DEPTH_STENCIL
,索引不会被转换。
组中的每个元素都被转换为浮点值。对于无符号或有符号的归一化定点元素,分别使用方程式2.1或2.2。
最终扩展到RGBA Final Expansion to RGBA
该步骤仅适用于非深度组件组。每个组将转换为包含4个元素的组,具体操作如下:如果一个组不包含A元素,则会添加A,并且对于整数组件,将A设置为1,对于浮点组件,将A设置为1.0。如果R、G或B中的任何一个在组中缺失,则会添加每个缺失的元素,并且对于整数组件,将每个缺失的元素赋值为0,对于浮点组件,将每个缺失的元素赋值为0.0。