8.6 OpenGL纹理和采样器:备用纹理图像规范命令

备用纹理图像规范命令 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_2DTEXTURE_1D_ARRAYTEXTURE_RECTANGLE,或者来自表8.19中的立方体贴图面目标之一。
  • xywidthheight精确对应于ReadPixels的相应参数(参见第18.2节);它们指定图像的宽度和高度,以及要复制的帧缓冲区区域的左下角(x,y)坐标。

图像从帧缓冲区中被复制,就像这些参数被传递给CopyPixels函数(参见第18.3节),其中类型参数根据internalformat的不同设置为COLORDEPTHDEPTH_STENCILSTENCIL_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参数则是纹理对象的名称。在每个命令中,targettexture的实际目标(即TEXTURE_TARGET值,参见第8.11.2节内容)必须与Table 8.15中所示的对应命令匹配。

不会更改纹理图像的internalformatwidthheightdepthborder参数,也不会更改子区域外的texel值。

每个命令中的level参数指定了要修改的纹理图像的级别。

TexSubImage*DTextureSubImage*D 中的widthheightdepthformattypedata参数与对应的TexImage*D命令中的相应参数相匹配(如果这些参数存在),这意味着它们接受相同的值,并具有相同的意义。例外情况是,NULL数据指针不代表未指定的图像内容。

CopyTex*SubImage3DCopyTex*SubImage2D中的xywidthheight参数与CopyTexImage2D命令中的对应参数匹配。而CopyTex*SubImage1D中的xywidth参数则与CopyTexImage1D命令中的对应参数匹配。

这些命令均以与其对应的TexImage命令完全相同的方式解释和处理像素组,但不同之处在于,将R、G、B、A、深度和模板索引像素组值分配给纹理组件的过程由纹理图像的internalformat决定,而不是通过命令的参数决定。

Tex*SubImage3DCopyTex*SubImage3D命令中的xoffsetyoffsetzoffset参数指定了纹理图像中一个宽为width、高为height、深为depth矩形子区域左下后侧texel坐标。对于立方体贴图数组纹理,zoffset表示要更新的第一个面层编号,而depth表示要更新的面层数量。仅针对TextureSubImage3DCopyTextureSubImage3D命令,texture可以是一个立方体贴图纹理。在这种情况下,zoffset被解释为指定Table 9.3中相应层面对应的立方体贴图面,并且depth表示连续更新的贴图面数量。

CopyTex*SubImage3D相关的depth参数始终为1,因为帧缓冲区内存是二维的,这些命令仅替换三维纹理的一个(s, t)切片部分。

子区域必须位于纹理图像的边界内。

纹理压缩内部格式存储方式可能使得无法在不进行解压和重新压缩的情况下用子图像命令修改图像。即使以这种方式修改了图像,也可能无法保留待修改区域外部某些texel的内容。为了避免这些复杂性,GL不支持对具有压缩内部格式的纹理图像进行任意修改。如果xoffsetyoffsetzoffset不等于零,则调用任何Tex*SubImage*CopyTex*SubImage*命令将生成INVALID_OPERATION错误。此外,此类调用所修改区域之外的任何texel的内容未定义。

如果正在修改的纹理图像的内部格式属于Table 8.14中描述的具体压缩格式之一,则该纹理采用相应的压缩纹理图像编码方式进行存储(参见附录D)。由于这类图像易于沿4 × 4 texel边界编辑,因此对于Tex*SubImage2DTex*SubImage3DCopyTex*SubImage2DCopyTex*SubImage3D命令放宽了子图像位置和大小的限制。当满足以下条件之一时,这些命令将生成INVALID_OPERATION错误:

  • width不是4的倍数,且width + xoffset 不等于 TEXTURE_WIDTH 的值,同时xoffsetyoffset不为零;
  • height不是4的倍数,且height + yoffset 不等于 TEXTURE_HEIGHT 的值,同时xoffsetyoffset不为零;
  • xoffsetyoffset不是4的倍数。

在有效的Tex*SubImage*Copy*TexSubImage*调用期间,此类压缩纹理图像中与正在修改区域不相交的任何4 × 4 texel块的内容都将得到保留。

纹理复制反馈循环 Texture Copying Feedback Loops

如果目标纹理图像级别同时也绑定到了读取帧缓冲区的选定读取缓冲区(参见第18.2.1节),则调用任何CopyTex*SubImage*CopyTexImage*命令将导致未定义的行为。这种情况在关于9.3.2节中的反馈循环描述中有更详细的讨论。


Command NamesValid 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值