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中列出的具体压缩内部格式符号常量之一。
  • widthheightdepth分别指定纹理的宽度、高度和深度(对于 3D 纹理而言)。
  • border设置为 0,因为大多数现代 OpenGL 实现不支持带边框的纹理。
  • formattypedata指定图像数据的格式、类型以及当前绑定的像素解包缓冲区或客户端内存中图像数据的引用,如第8.4.4节所述。

内存中的组被视为按照一系列相邻的矩形排列。每个矩形是一个二维图像,其大小和排列方式由TexImage3D函数中的宽度和高度参数决定。UNPACK_ROW_LENGTHUNPACK_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_1DTEXTURE_2DTEXTURE_2D_MULTISAMPLETEXTURE_1D_ARRAYTEXTURE_2D_ARRAYTEXTURE_2D_MULTISAMPLE_ARRAYTEXTURE_RECTANGLETEXTURE_CUBE_MAPTEXTURE_CUBE_MAP_ARRAYPROXY_TEXTURE_1DPROXY_TEXTURE_2DPROXY_TEXTURE_2D_MULTISAMPLEPROXY_TEXTURE_1D_ARRAYPROXY_TEXTURE_2D_ARRAYPROXY_TEXTURE_2D_MULTISAMPLE_ARRAYPROXY_TEXTURE_RECTANGLEPROXY_TEXTURE_CUBE_MAPPROXY_TEXTURE_CUBE_MAP_ARRAY 之一时,才支持基本内部格式为 DEPTH_COMPONENTDEPTH_STENCILSTENCIL_INDEX 的纹理,使用纹理图像规范命令。如果将这些格式与其他目标结合使用,将生成 INVALID_OPERATION 错误。

基本内部格式为 DEPTH_COMPONENTDEPTH_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_B10FRGB9_E5需特殊处理。

如果指定了压缩内部格式,R、G、B 和 A 值映射到纹理组件的方式等同于表 8.11 中所指定相应基础内部格式组件的映射方式。指定的图像将通过由 GL 自行选择的一种(可能是有损的)压缩算法进行压缩。

OpenGL 实现可能会根据 TexImage3DTexImage2D(见下文)或 TexImage1D(见下文)参数中的任何值(除了目标 target 参数外)来变化其内部组件分辨率的分配或者压缩内部格式的选择,但是分配和选定的压缩图像格式不能依赖于任何其他状态,并且一旦确定后就不能更改。此外,压缩图像格式的选择不得受到 data 参数的影响。分配必须是不变的;每次使用相同参数值指定纹理图像时,都必须选择相同的分配方案和压缩图像格式。这些分配规则同样适用于代理纹理,代理纹理在第 8.22 节中有详细描述。

纹理图像结构 Texture Image Structure

  1. 纹理图像排列方式:纹理图像数据按照一组组数值序列排列,从纹理图像的左下后角开始,逐行逐列排列,最后按深度堆叠。每个组的R、G、B、A分量根据表8.11进行映射。

  2. 目标为TEXTURE_CUBE_MAP_ARRAY时的处理:纹理图像的深度索引k表示一个层面,每个层面对应一个立方体贴图面。

  3. 内部数据类型的处理:根据纹理图像的内部数据类型不同,颜色分量进行相应的转换或者截断处理。

  4. 细节级别(level)的定义:主纹理图像的细节级别为0,细节级别必须为非负整数。

  5. 纹理图像的最大尺寸限制:纹理图像的最大尺寸受纹理目标、细节级别和图像的内部格式等因素的影响,采用方程8.3进行计算,且不同纹理类型有不同的计算方式。

  6. 资源限制和内存耗尽:由于资源限制,实现可能无法成功创建最大尺寸的纹理,可能导致内存耗尽。

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 定义为立方体贴图数组中特定立方体贴图的索引。

如果TexImage1DTexImage2DTexImage3D的数据参数为NULL,并且像素解包缓冲对象为零,则将创建一个具有指定目标、级别、内部格式、边框、宽度、高度和深度的一维、二维或三维纹理图像,但是图像内容未指定。在这种情况下,不访问客户端内存中的像素值,也不执行像素处理。但是,将生成错误,就像数据指针有效一样。否则,如果像素解包缓冲对象不为零,则数据参数将按正常方式处理,以引用像素解包缓冲对象数据的开头。


Base Internal FormatRGBA, Depth, and Stencil ValuesInternal Components
DEPTH_COMPONENTDepthD
DEPTH_STENCILDepth,StencilD,S
REDRR
RGR,GR,G
RGBR,G,BR,G,B
RGBAR,G,B,AR,G,B,A
STENCIL_INDEXStencilS

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 FormatBase Internal FormatRGBAShareCRReq.rend.Req.tex.
R8RED8
R8_SNORMREDs8
R16RED16
R16_SNORMREDs16
RG8RG88
RG8_SNORMRGs8s8
RG16RG1616
RG16_SNORMRGs16s16
R3_G3_B2RGB332
RGB4RGB444
RGB5RGB555
RGB565RGB565
RGB8RGB888
RGB8_SNORMRGBs8s8s8
RGB10RGB101010
RGB12RGB121212
RGB16RGB161616
RGB16_SNORMRGBs16s16s16
RGBA2RGBA2222
RGBA4RGBA4444
RGB5_A1RGBA5551
RGBA8RGBA8888
RGBA8_SNORMRGBAs8s8s8s8
RGB10_A2RGBA1010102
RGB10_A2UIRGBAui10ui10ui10ui2
RGBA12RGBA12121212
RGBA16RGBA16161616
RGBA16_SNORMRGBAs16s16s16s16
SRGB8RGB888
SRGB8_ALPHA8RGBA8888
R16FREDf16
RG16FRGf16f16
RGB16FRGBf16f16f16
RGBA16FRGBAf16f16f16f16
R32FREDf32
RG32FRGf32f32
RGB32FRGBf32f32f32
RGBA32FRGBAf32f32f32f32
R11F_G11F_B10FRGBf11f11f10
RGB9_E5RGB9995
R8IREDi8
R8UIREDui8
R16IREDi16
R16UIREDui16
R32IREDi32
R32UIREDui32
RG8IRGi8i8
RG8UIRGui8ui8
RG16IRGi16i16
RG16UIRGui16ui16
RG32IRGi32i32
RG32UIRGui32ui32
RGB8IRGBi8i8i8
RGB8UIRGBui8ui8ui8
RGB16IRGBi16i16i16
RGB16UIRGBui16ui16ui16
RGB32IRGBi32i32i32
RGB32UIRGBui32ui32ui32
RGBA8IRGBAi8i8i8i8
RGBA8UIRGBAui8ui8ui8ui8
RGBA16IRGBAi16i16i16i16
RGBA16UIRGBAui16ui16ui16ui16
RGBA32IRGBAi32i32i32i32
RGBA32UIRGBAui32ui32ui32ui32

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 FormatBase Internal FormatD bitsS bitsReq.format
DEPTH_COMPONENT16DEPTH_COMPONENT16
DEPTH_COMPONENT24DEPTH_COMPONENT24
DEPTH_COMPONENT32DEPTH_COMPONENT32
DEPTH_COMPONENT32FDEPTH_COMPONENTf32
DEPTH24_STENCIL8DEPTH_STENCIL24ui8
DEPTH32F_STENCIL8DEPTH_STENCILf32ui8
STENCIL_INDEX1STENCIL_INDEXui1
STENCIL_INDEX4STENCIL_INDEXui4
STENCIL_INDEX8STENCIL_INDEXui8
STENCIL_INDEX16STENCIL_INDEXui16

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 FormatBase Internal FormatTypeBorder TypeCopyable
COMPRESSED_REDREDGenericunorm
COMPRESSED_RGRGGenericunorm
COMPRESSED_RGBRGBGenericunorm
COMPRESSED_RGBARGBAGenericunorm
COMPRESSED_SRGBRGBGenericunorm
COMPRESSED_SRGB_ALPHARGBAGenericunorm
COMPRESSED_RED_RGTC1REDSpecificunorm
COMPRESSED_SIGNED_RED_RGTC1REDSpecificsnorm
COMPRESSED_RG_RGTC2RGSpecificunorm
COMPRESSED_SIGNED_RG_RGTC2RGSpecificsnorm
COMPRESSED_RGBA_BPTC_UNORMRGBASpecificunorm
COMPRESSED_SRGB_ALPHA_BPTC_UNORMRGBASpecificunorm
COMPRESSED_RGB_BPTC_SIGNED_FLOATRGBSpecificfloat
COMPRESSED_RGB_BPTC_UNSIGNED_FLOATRGBSpecificfloat
COMPRESSED_RGB8_ETC2RGBSpecificunorm
COMPRESSED_SRGB8_ETC2RGBSpecificunorm
COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2RGBSpecificunorm
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2RGBSpecificunorm
COMPRESSED_RGBA8_ETC2_EACRGBASpecificunorm
COMPRESSED_SRGB8_ALPHA8_ETC2_EACRGBASpecificunorm
COMPRESSED_R11_EACREDSpecificunorm
COMPRESSED_SIGNED_R11_EACREDSpecificsnorm
COMPRESSED_RG11_EACRGSpecificunorm
COMPRESSED_SIGNED_RG11_EACRGSpecificsnorm

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 DirectionTargetsctcma
+rxTEXTURE_CUBE_MAP_POSITIVE_X−rz−ryrx
−rxTEXTURE_CUBE_MAP_NEGATIVE_Xrz−ryrx
+ryTEXTURE_CUBE_MAP_POSITIVE_Yrxrzry
−ryTEXTURE_CUBE_MAP_NEGATIVE_Yrx−rzry
+rzTEXTURE_CUBE_MAP_POSITIVE_Zrx−ryrz
−rzTEXTURE_CUBE_MAP_NEGATIVE_Z−rx−ryrz

Table 8.19: Selection of cube map images based on major axis direction of texture coordinates

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值