纹理(Texture)
纹理数据类型是一个指向1, 2 或者3维纹理数据的句柄. 纹理数据则是一个纹理的某个等级(level)的mipmap的全部或者部分数据.
enum class access { sample, read, write };
texture1d<T, access a = access::sample>
texture1d_array<T, access a = access::sample>
texture2d<T, access a = access::sample>
texture2d_array<T, access a = access::sample>
texture3d<T, access a = access::sample>
texturecube<T, access a = access::sample>
texturecube_array<T, access a = access::sample>
texture2d_ms<T, access a = access::read>
带深度信息的纹理必须按照下面的例子来声明:
depth2d<T, access a = access::sample>
depth2d_array<T, access a = access::sample>
depthcube<T, access a = access::sample>
depthcube_array<T, access a = access::sample>
depth2d_ms<T, access a = access::read
注意:
texturecube_array
和
depthcube_array
纹理类型只在OS X上支持 . texturecube的读写操作旨在 OS X 上支持
.
这里的T 表示对纹理数据进行读写操作时的颜色类型, 不含深度信息的纹理数据类型可以为half, float, short, ushort, int 或者 uint, 带深度信息的纹理数据类型必须为float.
access 修饰符决定了纹理数据应该如何被访问:
sample: 支持采样器(sampler), 支持通过采样器访问纹理数据, 也可以不使用采样器访问数据
read: 不支持采样器, kernal 或者 graphics 函数可以读取纹理数据
write: kernal 或者graphics 函数可以将数据写入纹理
注意:对于多采样纹理, 只支持read 访问, 对于深度纹理, 只支持 sample和read 访问.
下面是一个使用access修饰符的纹理对象作为函数参数的例子:
void foo (texture2d<float> imgA [[ texture(0) ]],
texture2d<float, access::read> imgB [[ texture(1) ]],
texture2d<float, access::write> imgC [[ texture(2) ]])
{
...
}
注意: 如果T是int或者short, 纹理数据类型是带符号整型, 如果T是uint或者ushort, 纹理数据类型必须是无符号整型, 如果T是half, 纹理数据类型可以是归一化(normalized)的整数或者半精度浮点类型. 如果T是float, 纹理数据类型可以使归一化的整数或者半精度或单精度浮点类型.
注: mipmap 是一种纹理映射方式, 请参见: http://baike.baidu.com/link?url=Bp2S4kep-e_KeUR0_o8XgTgn9pFNJymBPjyhN3ymt3G4NieXo-pe8cD_u36muzZgCkS251nG2Z-jKKUNG9Y_cq