纹理图像加载和存储 Texture Image Loads and Store
通过将纹理绑定到一组图像单元之一,可以使纹理的内容可供着色器读取和写入。GL实现提供了从零开始编号的图像单元数组,图像单元的总数由实现相关的MAX_IMAGE_UNITS
的值确定。与纹理图像单元不同,图像单元没有每个纹理目标的单独绑定点;每个图像单元一次只能绑定一个纹理。
将纹理绑定到图像单元以供图像加载和存储使用
void glBindImageTexture( uint unit, uint texture, int level, boolean layered, int layer, enum access, enum format );
其中,unit
标识图像单元,texture
是纹理的名称,level
选择纹理的单个级别。如果texture
为零,则会解除当前绑定到图像单元unit
上的任何纹理。
如果由texture
标识的纹理是一维数组、二维数组、三维、立方体贴图、立方体贴图数组或二维多重采样数组纹理,则可以绑定整个纹理级别或纹理级别的单个层或面。如果layered
为TRUE
,则绑定整个级别。如果layered
为FALSE
,则只绑定由layer
标识的单个层。当layered
为FALSE
时,单个绑定的层将被视为图像访问的不同纹理目标。
- 一维数组纹理层被视为一维纹理;
- 二维数组、三维、立方体贴图和立方体贴图数组纹理层被视为二维纹理;
- 二维多重采样数组纹理被视为二维多重采样纹理。
对于layered为FALSE的立方体贴图纹理,通过将层编号映射到面,根据Table 9.3
映射面。
对于layered为FALSE的立方体贴图数组纹理,通过以下方程和将面映射到面,根据Table 9.3
映射面:
layer = floor(layerorig / 6)
face = layerorig − (layer × 6)
如果由texture
标识的纹理没有多个层或面,无论layered
和layer
指定的值如何,都将绑定整个纹理级别。
format
指定在进行格式化存储时将图像元素视为的格式,稍后在本节中描述。这被称为图像单元格式。
access
指定绑定到图像的纹理将被视为READ_ONLY
、WRITE_ONLY
还是READ_WRITE
。如果着色器从绑定为WRITE_ONLY
的图像单元读取,或者向绑定为READ_ONLY
的图像单元写入,则该着色器操作的结果是未定义的,可能导致应用程序终止。
如果一个绑定到一个或多个图像单元的纹理对象被DeleteTextures
删除,它将从每个图像单元中分离,就像调用BindImageTexture
将unit
标识的图像单元和texture
设置为零一样。
将纹理绑定到多个图像单元
void glBindImageTextures(uint first, sizei count, const uint *textures);
将count
个现有纹理对象绑定到从first
到first + count − 1
编号的图像单元。如果textures
不为NULL
,则它指定了一个包含count
个值的数组,每个值必须为零或现有纹理对象的名称。如果textures
为NULL
,则从first
到first + count − 1
的每个受影响的图像单元将重置为没有绑定的纹理对象。
当将非零纹理对象绑定到图像单元时,图像单元的级别(level&