备用纹理图像规范命令 Alternate Texture Image Specification Commands
二维和一维纹理图像也可以使用直接从帧缓冲区获取的图像数据进行指定,并且可以重新指定现有纹理图像的矩形子区域。
定义一个二维纹理图像
void glCopyTexImage2D( enum target, int level, enum internalformat, int x, int y, sizei width, sizei height, int border );
定义一个二维纹理图像,其方式与TexImage2D完全相同,区别是图像数据来自帧缓冲区而不是客户端内存。
target必须是TEXTURE_2D、TEXTURE_1D_ARRAY、TEXTURE_RECTANGLE,或者来自表8.19中的立方体贴图面目标之一。x、y、width和height精确对应于ReadPixels的相应参数(参见第18.2节);它们指定图像的宽度和高度,以及要复制的帧缓冲区区域的左下角(x,y)坐标。
图像从帧缓冲区中被复制,就像这些参数被传递给CopyPixels函数(参见第18.3节),其中类型参数根据internalformat的不同设置为COLOR、DEPTH、DEPTH_STENCIL或STENCIL_INDEX。
定义一维纹理图像
void glCopyTexImage1D( enum target, int level, enum internalformat, int x, int y, sizei width, int border );
以与TexImage1D完全相同的方式定义一维纹理图像,唯一的区别是图像数据来自帧缓冲区,而不是客户端内存。
target必须是TEXTURE_1D。
要仅重新指定纹理对象的纹理图像的矩形子区域,使用以下命令:
void glTexSubImage3D( enum target, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, enum type, const void *data );
void glTexSubImage2D( enum target, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, enum type, const void *data );
void glTexSubImage1D( enum target, int level, int xoffset, sizei width, enum format, enum type, const void *data );
void glCopyTexSubImage3D( enum target, int level, int xoffset, int yoffset, int zoffset, int x, int y, sizei width, sizei height );
void glCopyTexSubImage2D( enum target, int level, int xoffset, int yoffset, int x, int y, sizei width, sizei height );
void glCopyTexSubImage1D( enum target, int level, int xoffset, int x, int y, sizei width );
void glTextureSubImage3D( uint texture, int level, int xoffset, int yoffset, int zoffset, sizei width, sizei height, sizei depth, enum format, enum type, const void *pixels );
void glTextureSubImage2D( uint texture, int level, int xoffset, int yoffset, sizei width, sizei height, enum format, enum type, const void *pixels );
void glTextureSubImage1D( uint texture, int level, int xoffset, sizei width, enum format, enum type, const void *pixels );
void glCopyTextureSubImage3D( uint texture, int level, int xoffset, int yoffset, int zoffset, int x, int y, sizei width, sizei height );
void glCopyTextureSubImage2D( uint texture, int level, int xoffset, int yoffset, int x, int y, sizei width, sizei height );
void glCopyTextureSubImage1D( uint texture, int level, int xoffset, int x, int y, sizei width );
对于*TexSubImage*,纹理对象是指与target绑定的纹理对象;而对于*TextureSubImage*,texture参数则是纹理对象的名称。在每个命令中,target或texture的实际目标(即TEXTURE_TARGET值,参见第8.11.2节内容)必须与Table 8.15中所示的对应命令匹配。
不会更改纹理图像的internalformat、width、height、depth或border参数,也不会更改子区域外的texel值。
每个命令中的level参数指定了要修改的纹理图像的级别。
TexSubImage*D 和 TextureSubImage*D 中的width、height、depth、format、type和data参数与对应的TexImage*D命令中的相应参数相匹配(如果这些参数存在),这意味着它们接受相同的值,并具有相同的意义。例外情况是,NULL数据指针不代表未指定的图像内容。
CopyTex*SubImage3D和CopyTex*SubImage2D中的x、y、width和height参数与CopyTexImage2D命令中的对应参数匹配。而CopyTex*SubImage1D中的x、y和width参数则与CopyTexImage1D命令中的对应参数匹配。
这些命令均以与其对应的TexImage命令完全相同的方式解释和处理像素组,但不同之处在于,将R、G、B、A、深度和模板索引像素组值分配给纹理组件的过程由纹理图像的internalformat决定,而不是通过命令的参数决定。
Tex*SubImage3D和CopyTex*SubImage3D命令中的xoffset、yoffset和zoffset参数指定了纹理图像中一个宽为width、高为height、深为depth矩形子区域左下后侧texel坐标。对于立方体贴图数组纹理,zoffset表示要更新的第一个面层编号,而depth表示要更新的面层数量。仅针对TextureSubImage3D和CopyTextureSubImage3D命令,texture可以是一个立方体贴图纹理。在这种情况下,zoffset被解释为指定Table 9.3中相应层面对应的立方体贴图面,并且depth表示连续更新的贴图面数量。
与CopyTex*SubImage3D相关的depth参数始终为1,因为帧缓冲区内存是二维的,这些命令仅替换三维纹理的一个(s, t)切片部分。
子区域必须位于纹理图像的边界内。
纹理压缩内部格式存储方式可能使得无法在不进行解压和重新压缩的情况下用子图像命令修改图像。即使以这种方式修改了图像,也可能无法保留待修改区域外部某些texel的内容。为了避免这些复杂性,GL不支持对具有压缩内部格式的纹理图像进行任意修改。如果xoffset、yoffset或zoffset不等于零,则调用任何Tex*SubImage*或CopyTex*SubImage*命令将生成INVALID_OPERATION错误。此外,此类调用所修改区域之外的任何texel的内容未定义。
如果正在修改的纹理图像的内部格式属于Table 8.14中描述的具体压缩格式之一,则该纹理采用相应的压缩纹理图像编码方式进行存储(参见附录D)。由于这类图像易于沿4 × 4 texel边界编辑,因此对于Tex*SubImage2D、Tex*SubImage3D、CopyTex*SubImage2D和CopyTex*SubImage3D命令放宽了子图像位置和大小的限制。当满足以下条件之一时,这些命令将生成INVALID_OPERATION错误:
width不是4的倍数,且width+xoffset不等于TEXTURE_WIDTH的值,同时xoffset或yoffset不为零;height不是4的倍数,且height+yoffset不等于TEXTURE_HEIGHT的值,同时xoffset或yoffset不为零;xoffset或yoffset不是4的倍数。
在有效的Tex*SubImage*和Copy*TexSubImage*调用期间,此类压缩纹理图像中与正在修改区域不相交的任何4 × 4 texel块的内容都将得到保留。
纹理复制反馈循环 Texture Copying Feedback Loops
如果目标纹理图像级别同时也绑定到了读取帧缓冲区的选定读取缓冲区(参见第18.2.1节),则调用任何CopyTex*SubImage*或CopyTexImage*命令将导致未定义的行为。这种情况在关于9.3.2节中的反馈循环描述中有更详细的讨论。
| Command Names | Valid targets or effective texture targets |
|---|---|
| TexSubImage1D CopyTexSubImage1D TextureSubImage1D CopyTextureSubImage1D | TEXTURE_1D |
| TexSubImage2D CopyTexSubImage2D | TEXTURE_2D TEXTURE_1D_ARRAY TEXTURE_RECTANGLE one of the cube map face targets from table 8.19 |
| TextureSubImage2D CopyTextureSubImage2D | TEXTURE_2D TEXTURE_1D_ARRAY TEXTURE_RECTANGLE |
| TexSubImage3D CopyTexSubImage3D | TEXTURE_3D TEXTURE_2D_ARRAY TEXTURE_CUBE_MAP_ARRAY |
| TextureSubImage3D CopyTextureSubImage3D | TEXTURE_3D TEXTURE_2D_ARRAY TEXTURE_CUBE_MAP_ARRAY TEXTURE_CUBE_MAP |
Table 8.15: Valid texture target parameters or effective texture targets for texture subimage commands