Metal 着色语言编程指南 十

来源:互联网 发布:邮箱管理软件 mac 编辑:程序博客网 时间:2024/06/04 19:21

纹理(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
2 0