本文主要是介绍8.5 OpenGL纹理和采样器:纹理图像规范,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
纹理图像规范 Texture Image Specification
void glTexImage3D( enum target, int level, int internalformat, sizei width, sizei height, sizei depth, int border, enum format, enum type, const void *data );
指定三维纹理图像。
target
必须是以下值之一:TEXTURE_3D
表示三维纹理;TEXTURE_2D_ARRAY
表示二维数组纹理;TEXTURE_CUBE_MAP_ARRAY
表示立方体贴图数组纹理;PROXY_TEXTURE_3D
表示三维代理纹理;PROXY_TEXTURE_2D_ARRAY
表示二维数组代理纹理;PROXY_TEXTURE_CUBE_MAP_ARRAY
表示立方体贴图数组代理纹理;
level
指定 mipmap 级别。0 表示基本纹理级别;更高的数值对应于更小分辨率的 mipmap 层次。internalformat
可以指定为Table 8.11
中列出的内部格式符号,也可以是Table 8.12-8.13
中列出的尺寸化内部格式符号常量之一,或者是Table 8.14
中列出的通用压缩内部格式符号常量之一,或者是在Table 8.14
中列出的具体压缩内部格式符号常量之一。width
、height
、depth
分别指定纹理的宽度、高度和深度(对于 3D 纹理而言)。border
设置为 0,因为大多数现代 OpenGL 实现不支持带边框的纹理。format
、type
和data
指定图像数据的格式、类型以及当前绑定的像素解包缓冲区或客户端内存中图像数据的引用,如第8.4.4节所述。
内存中的组被视为按照一系列相邻的矩形排列。每个矩形是一个二维图像,其大小和排列方式由TexImage3D
函数中的宽度和高度参数决定。UNPACK_ROW_LENGTH
和UNPACK_ALIGNMENT
值控制了这些图像行与行之间的间距,详情请参阅第8.4.4节。如果整数参数UNPACK_IMAGE_HEIGHT
不为正,则每二维图像的行数为height
;否则,行数为UNPACK_IMAGE_HEIGHT
。每个二维图像包含整数个连续的行,并且紧邻其相邻图像。
选取三维图像子体积的机制依赖于整数参数UNPACK_SKIP_IMAGES
。若该值为正,则在从内存获取第一个数据组之前,指针会向前移动UNPACK_SKIP_IMAGES
乘以一个二维图像元素数量的距离。然后处理depth
个二维图像,每个图像按照第8.4.4节描述的方式提取子图像。
如果基本内部格式为 DEPTH_STENCIL
,而格式不是 DEPTH_STENCIL
,则模板索引纹理分量的值是未定义的。
只有当目标为 TEXTURE_1D
、TEXTURE_2D
、TEXTURE_2D_MULTISAMPLE
、TEXTURE_1D_ARRAY
、TEXTURE_2D_ARRAY
、TEXTURE_2D_MULTISAMPLE_ARRAY
、TEXTURE_RECTANGLE
、TEXTURE_CUBE_MAP
、TEXTURE_CUBE_MAP_ARRAY
、PROXY_TEXTURE_1D
、PROXY_TEXTURE_2D
、PROXY_TEXTURE_2D_MULTISAMPLE
、PROXY_TEXTURE_1D_ARRAY
、PROXY_TEXTURE_2D_ARRAY
、PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY
、PROXY_TEXTURE_RECTANGLE
、PROXY_TEXTURE_CUBE_MAP
或 PROXY_TEXTURE_CUBE_MAP_ARRAY
之一时,才支持基本内部格式为 DEPTH_COMPONENT
、DEPTH_STENCIL
或 STENCIL_INDEX
的纹理,使用纹理图像规范命令。如果将这些格式与其他目标结合使用,将生成 INVALID_OPERATION
错误。
基本内部格式为 DEPTH_COMPONENT
或 DEPTH_STENCIL
的纹理要求具有深度分量数据或深度/模板分量数据。
具有其他基本内部格式的纹理要求 RGBA
分量数据。具有整数内部格式的纹理(参见表8.12)要求整数数据。
通用压缩内部格式不能直接用作纹理图像的内部格式。
所需的纹理格式 Required Texture Formats
实现必须至少支持每种基本内部格式的每种类型(unsigned int、float 等)的一个内部分量分辨率分配。
此外,实现必须支持以下尺寸化和压缩的内部格式。对于任何纹理类型请求这些尺寸化内部格式将至少分配内部分量大小,并且完全分配相应表中所示的该格式的组件类型:
- 在表8.12的“Req. tex.”列中标记的颜色格式。
- 表8.14中的所有特定压缩纹理格式。
- 在表8.13的“Req. format”列中标记的深度、深度+模板和模板格式。
特殊内部格式的编码 Encoding of Special Internal Formats
R11F_G11F_B10F
与 RGB9_E5
需特殊处理。
如果指定了压缩内部格式,R、G、B 和 A 值映射到纹理组件的方式等同于表 8.11 中所指定相应基础内部格式组件的映射方式。指定的图像将通过由 GL 自行选择的一种(可能是有损的)压缩算法进行压缩。
OpenGL 实现可能会根据 TexImage3D
、TexImage2D
(见下文)或 TexImage1D
(见下文)参数中的任何值(除了目标 target
参数外)来变化其内部组件分辨率的分配或者压缩内部格式的选择,但是分配和选定的压缩图像格式不能依赖于任何其他状态,并且一旦确定后就不能更改。此外,压缩图像格式的选择不得受到 data
参数的影响。分配必须是不变的;每次使用相同参数值指定纹理图像时,都必须选择相同的分配方案和压缩图像格式。这些分配规则同样适用于代理纹理,代理纹理在第 8.22 节中有详细描述。
纹理图像结构 Texture Image Structure
-
纹理图像排列方式:纹理图像数据按照一组组数值序列排列,从纹理图像的左下后角开始,逐行逐列排列,最后按深度堆叠。每个组的R、G、B、A分量根据表8.11进行映射。
-
目标为TEXTURE_CUBE_MAP_ARRAY时的处理:纹理图像的深度索引k表示一个层面,每个层面对应一个立方体贴图面。
-
内部数据类型的处理:根据纹理图像的内部数据类型不同,颜色分量进行相应的转换或者截断处理。
-
细节级别(level)的定义:主纹理图像的细节级别为0,细节级别必须为非负整数。
-
纹理图像的最大尺寸限制:纹理图像的最大尺寸受纹理目标、细节级别和图像的内部格式等因素的影响,采用方程8.3进行计算,且不同纹理类型有不同的计算方式。
-
资源限制和内存耗尽:由于资源限制,实现可能无法成功创建最大尺寸的纹理,可能导致内存耗尽。
void glTexImage2D( enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, const void *data );
指定二维纹理图像。
target
必须是以下之一:TEXTURE_2D
:表示一个二维纹理。TEXTURE_1D_ARRAY
:表示一维数组纹理。TEXTURE_RECTANGLE
:表示矩形纹理。- 表 8.19 中列出的立方体贴图面目标之一,用于立方体贴图纹理。
PROXY_TEXTURE_2D
:表示二维代理纹理。PROXY_TEXTURE_1D_ARRAY
:表示一维代理数组纹理。PROXY_TEXTURE_RECTANGLE
:表示矩形代理纹理。PROXY_TEXTURE_CUBE_MAP
:表示立方体贴图代理纹理。
其他参数与 TexImage3D
函数中的对应参数相同。
对于解码纹理图像的目的,TexImage2D
等同于调用 TexImage3D
并设置深度为 1,但忽略 UNPACK_SKIP_IMAGES
参数。
二维或矩形纹理由单一的二维纹理图像组成。立方体贴图纹理是一组六个二维纹理图像。表 8.19 中列出的六个立方体贴图面目标共同构成一个立方体贴图纹理。这些目标分别更新相应的立方体贴图面二维纹理图像。请注意,在指定、更新或查询立方体贴图六张二维图像时使用立方体贴图面目标,但在绑定到立方体贴图纹理对象(即当整个立方体贴图作为一个整体访问而非特定二维图像)时,应使用 TEXTURE_CUBE_MAP
目标。
void TexImage1D( enum target, int level, int internalformat, sizei width, int border, enum format, enum type, const void *data );
指定一维纹理图像。
target
必须是TEXTURE_1D
,或者在第 8.22 节讨论的特殊情况下为PROXY_TEXTURE_1D
。
从解码纹理图像的角度看,TexImage1D 等同于调用 TexImage2D 并设置高度为 1。
纹理图像中的元素(i, j, k)被称为纹理像素(texel)。对于二维纹理或一维数组纹理,k 参数无关紧要;对于一维纹理,j 和 k 都不相关。用于着色片段的纹理值通过在着色器中对纹理进行采样来确定,但可能并不对应任何实际的纹理像素。参见图 8.3。如果目标是 TEXTURE_CUBE_MAP_ARRAY
,则纹理值由坐标 (s, t, r, q) 确定,其中 s、t 和 r 的定义与 TEXTURE_CUBE_MAP
相同,q 定义为立方体贴图数组中特定立方体贴图的索引。
如果TexImage1D
、TexImage2D
或TexImage3D
的数据参数为NULL
,并且像素解包缓冲对象为零,则将创建一个具有指定目标、级别、内部格式、边框、宽度、高度和深度的一维、二维或三维纹理图像,但是图像内容未指定。在这种情况下,不访问客户端内存中的像素值,也不执行像素处理。但是,将生成错误,就像数据指针有效一样。否则,如果像素解包缓冲对象不为零,则数据参数将按正常方式处理,以引用像素解包缓冲对象数据的开头。
Base Internal Format | RGBA, Depth, and Stencil Values | Internal Components |
---|---|---|
DEPTH_COMPONENT | Depth | D |
DEPTH_STENCIL | Depth,Stencil | D,S |
RED | R | R |
RG | R,G | R,G |
RGB | R,G,B | R,G,B |
RGBA | R,G,B,A | R,G,B,A |
STENCIL_INDEX | Stencil | S |
Table 8.11: Conversion from RGBA, depth, and stencil pixel components to internal texture components. Texture components R, G, B, and A are converted back to RGBA colors during filtering as shown in table 15.1
Sized Internal Format | Base Internal Format | R | G | B | A | Share | CR | Req.rend. | Req.tex. |
---|---|---|---|---|---|---|---|---|---|
R8 | RED | 8 | √ | √ | √ | ||||
R8_SNORM | RED | s8 | √ | √ | |||||
R16 | RED | 16 | √ | √ | √ | ||||
R16_SNORM | RED | s16 | √ | √ | |||||
RG8 | RG | 8 | 8 | √ | √ | √ | |||
RG8_SNORM | RG | s8 | s8 | √ | √ | ||||
RG16 | RG | 16 | 16 | √ | √ | √ | |||
RG16_SNORM | RG | s16 | s16 | √ | √ | ||||
R3_G3_B2 | RGB | 3 | 3 | 2 | √ | √ | |||
RGB4 | RGB | 4 | 4 | 4 | √ | √ | |||
RGB5 | RGB | 5 | 5 | 5 | √ | √ | |||
RGB565 | RGB | 5 | 6 | 5 | √ | √ | √ | ||
RGB8 | RGB | 8 | 8 | 8 | √ | √ | |||
RGB8_SNORM | RGB | s8 | s8 | s8 | √ | √ | |||
RGB10 | RGB | 10 | 10 | 10 | √ | √ | |||
RGB12 | RGB | 12 | 12 | 12 | √ | √ | |||
RGB16 | RGB | 16 | 16 | 16 | √ | √ | |||
RGB16_SNORM | RGB | s16 | s16 | s16 | √ | √ | |||
RGBA2 | RGBA | 2 | 2 | 2 | 2 | √ | √ | ||
RGBA4 | RGBA | 4 | 4 | 4 | 4 | √ | √ | √ | |
RGB5_A1 | RGBA | 5 | 5 | 5 | 1 | √ | √ | √ | |
RGBA8 | RGBA | 8 | 8 | 8 | 8 | √ | √ | √ | |
RGBA8_SNORM | RGBA | s8 | s8 | s8 | s8 | √ | √ | ||
RGB10_A2 | RGBA | 10 | 10 | 10 | 2 | √ | √ | √ | |
RGB10_A2UI | RGBA | ui10 | ui10 | ui10 | ui2 | √ | √ | √ | |
RGBA12 | RGBA | 12 | 12 | 12 | 12 | √ | √ | ||
RGBA16 | RGBA | 16 | 16 | 16 | 16 | √ | √ | √ | |
RGBA16_SNORM | RGBA | s16 | s16 | s16 | s16 | √ | √ | ||
SRGB8 | RGB | 8 | 8 | 8 | √ | √ | |||
SRGB8_ALPHA8 | RGBA | 8 | 8 | 8 | 8 | √ | √ | √ | |
R16F | RED | f16 | √ | √ | √ | ||||
RG16F | RG | f16 | f16 | √ | √ | √ | |||
RGB16F | RGB | f16 | f16 | f16 | √ | √ | |||
RGBA16F | RGBA | f16 | f16 | f16 | f16 | √ | √ | √ | |
R32F | RED | f32 | √ | √ | √ | ||||
RG32F | RG | f32 | f32 | √ | √ | √ | |||
RGB32F | RGB | f32 | f32 | f32 | √ | √ | |||
RGBA32F | RGBA | f32 | f32 | f32 | f32 | √ | √ | √ | |
R11F_G11F_B10F | RGB | f11 | f11 | f10 | √ | √ | √ | ||
RGB9_E5 | RGB | 9 | 9 | 9 | 5 | √ | |||
R8I | RED | i8 | √ | √ | √ | ||||
R8UI | RED | ui8 | √ | √ | √ | ||||
R16I | RED | i16 | √ | √ | √ | ||||
R16UI | RED | ui16 | √ | √ | √ | ||||
R32I | RED | i32 | √ | √ | √ | ||||
R32UI | RED | ui32 | √ | √ | √ | ||||
RG8I | RG | i8 | i8 | √ | √ | √ | |||
RG8UI | RG | ui8 | ui8 | √ | √ | √ | |||
RG16I | RG | i16 | i16 | √ | √ | √ | |||
RG16UI | RG | ui16 | ui16 | √ | √ | √ | |||
RG32I | RG | i32 | i32 | √ | √ | √ | |||
RG32UI | RG | ui32 | ui32 | √ | √ | √ | |||
RGB8I | RGB | i8 | i8 | i8 | √ | √ | |||
RGB8UI | RGB | ui8 | ui8 | ui8 | √ | √ | |||
RGB16I | RGB | i16 | i16 | i16 | √ | √ | |||
RGB16UI | RGB | ui16 | ui16 | ui16 | √ | √ | |||
RGB32I | RGB | i32 | i32 | i32 | √ | √ | |||
RGB32UI | RGB | ui32 | ui32 | ui32 | √ | √ | |||
RGBA8I | RGBA | i8 | i8 | i8 | i8 | √ | √ | √ | |
RGBA8UI | RGBA | ui8 | ui8 | ui8 | ui8 | √ | √ | √ | |
RGBA16I | RGBA | i16 | i16 | i16 | i16 | √ | √ | √ | |
RGBA16UI | RGBA | ui16 | ui16 | ui16 | ui16 | √ | √ | √ | |
RGBA32I | RGBA | i32 | i32 | i32 | i32 | √ | √ | √ | |
RGBA32UI | RGBA | ui32 | ui32 | ui32 | ui32 | √ | √ | √ |
Table 8.12: Correspondence of sized internal color formats to base internal formats, internal data type, and desired component resolutions for each sized internal format. The component resolution prefix indicates the internal data type: f is floating-point, i is signed integer, ui is unsigned integer, s is signed normalized fixed-point, and no prefix is unsigned normalized fixed-point. The “CR”, “Req. tex.”, and “Req. rend.” columns are described in sections 9.4, 8.5.1, and 9.2.5, respectively
Sized Internal Format | Base Internal Format | D bits | S bits | Req.format |
---|---|---|---|---|
DEPTH_COMPONENT16 | DEPTH_COMPONENT | 16 | √ | |
DEPTH_COMPONENT24 | DEPTH_COMPONENT | 24 | √ | |
DEPTH_COMPONENT32 | DEPTH_COMPONENT | 32 | ||
DEPTH_COMPONENT32F | DEPTH_COMPONENT | f32 | √ | |
DEPTH24_STENCIL8 | DEPTH_STENCIL | 24 | ui8 | √ |
DEPTH32F_STENCIL8 | DEPTH_STENCIL | f32 | ui8 | √ |
STENCIL_INDEX1 | STENCIL_INDEX | ui1 | ||
STENCIL_INDEX4 | STENCIL_INDEX | ui4 | ||
STENCIL_INDEX8 | STENCIL_INDEX | ui8 | √ | |
STENCIL_INDEX16 | STENCIL_INDEX | ui16 |
Table 8.13: Correspondence of sized internal depth and stencil formats to base internal formats, internal data type, and desired component resolutions for each sized internal format. The component resolution prefix indicates the internal data type: f is floating-point, i is signed integer, ui is unsigned integer, and no prefix is fixed-point. The “Req. format” column is described in section 8.5.1
Compressed Internal Format | Base Internal Format | Type | Border Type | Copyable |
---|---|---|---|---|
COMPRESSED_RED | RED | Generic | unorm | √ |
COMPRESSED_RG | RG | Generic | unorm | √ |
COMPRESSED_RGB | RGB | Generic | unorm | √ |
COMPRESSED_RGBA | RGBA | Generic | unorm | √ |
COMPRESSED_SRGB | RGB | Generic | unorm | √ |
COMPRESSED_SRGB_ALPHA | RGBA | Generic | unorm | √ |
COMPRESSED_RED_RGTC1 | RED | Specific | unorm | √ |
COMPRESSED_SIGNED_RED_RGTC1 | RED | Specific | snorm | √ |
COMPRESSED_RG_RGTC2 | RG | Specific | unorm | √ |
COMPRESSED_SIGNED_RG_RGTC2 | RG | Specific | snorm | √ |
COMPRESSED_RGBA_BPTC_UNORM | RGBA | Specific | unorm | √ |
COMPRESSED_SRGB_ALPHA_BPTC_UNORM | RGBA | Specific | unorm | √ |
COMPRESSED_RGB_BPTC_SIGNED_FLOAT | RGB | Specific | float | √ |
COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT | RGB | Specific | float | √ |
COMPRESSED_RGB8_ETC2 | RGB | Specific | unorm | |
COMPRESSED_SRGB8_ETC2 | RGB | Specific | unorm | |
COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 | RGB | Specific | unorm | |
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 | RGB | Specific | unorm | |
COMPRESSED_RGBA8_ETC2_EAC | RGBA | Specific | unorm | |
COMPRESSED_SRGB8_ALPHA8_ETC2_EAC | RGBA | Specific | unorm | |
COMPRESSED_R11_EAC | RED | Specific | unorm | |
COMPRESSED_SIGNED_R11_EAC | RED | Specific | snorm | |
COMPRESSED_RG11_EAC | RG | Specific | unorm | |
COMPRESSED_SIGNED_RG11_EAC | RG | Specific | snorm |
Table 8.14: Generic and specific compressed internal formats. Specific formats are described in appendix D. The “Border Type” field determines how border colors are clamped, as described in section 8.14.2. The “Copyable” field specifies if the format may be used with non-compressed texture image commands
Major Axis Direction | Target | sc | tc | ma |
---|---|---|---|---|
+rx | TEXTURE_CUBE_MAP_POSITIVE_X | −rz | −ry | rx |
−rx | TEXTURE_CUBE_MAP_NEGATIVE_X | rz | −ry | rx |
+ry | TEXTURE_CUBE_MAP_POSITIVE_Y | rx | rz | ry |
−ry | TEXTURE_CUBE_MAP_NEGATIVE_Y | rx | −rz | ry |
+rz | TEXTURE_CUBE_MAP_POSITIVE_Z | rx | −ry | rz |
−rz | TEXTURE_CUBE_MAP_NEGATIVE_Z | −rx | −ry | rz |
Table 8.19: Selection of cube map images based on major axis direction of texture coordinates
这篇关于8.5 OpenGL纹理和采样器:纹理图像规范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!