美文网首页
Metal Shading Language

Metal Shading Language

作者: zhongxiaoyue | 来源:发表于2019-07-10 18:18 被阅读0次

介绍

  • Metal着⾊语言是⼀个⽤来编写3D图形渲染逻辑和并行计算核心逻辑的编程语言,编写Metal框架的APP需要使用Metal 着色语⾔程序.
  • Metal 着色语⾔ 与 Metal 框架配合使用,Metal 框架管理Metal着⾊语言的运行和可选编译选项. Metal 着色器语言使用Clang和LLVM,编译器对于在GPU上的代码执行效率有更好的控制.

Metal 与 C++ 11.0

Metal 这门语言是基于C++ 11.0标准设计的.它在C++基础是多了⼀些拓展和限制.下面我们可以简单介绍Metal着⾊语言与C++11.0 相⽐之下的修改和限制.

Metal Restrictions 限制
如下的C++11.0的特性在Metal 着⾊语言中是不⽀持的.

  • Lambda表达式
  • 递归函数调⽤用
  • 动态转换操作符
  • 类型识别
  • 对象创建(new)和释放(delloc)操作符
  • 操作符 noexcept
  • goto跳转
  • 虚函数修饰符
  • 派⽣生类
  • 异常处理理

C++的标准库不可以在Metal 着色语言中使用
Metal 着色语言是有对于指针的使用限制. Metal图形和并行计算函数用到的入参如果是指针使用地址空间修饰符 (device ,threadgroup ,constant)
不支持函数指针
Metal函数名不能命名为Main函数

Metal 数据类型

  • Metal 向量和矩阵数据类型
    向量支持如下类型:
    booln charn shortn intn ucharn ushortn uintn halfn floatn
    向量中的n,指的是维度

  • Metal 向量和矩阵数据类型
    矩阵支持如下类型: halfnxm floatnxm
    nxm分别指的是矩阵的行数列数.

缓存buffer

在Metal 中实现缓存靠的是一个指针.它指向一个在Device 或者 constant 地址空间中的内建或是开发者自定义的数据块.缓存可以被定在程序域域中,或是当做函数的参数传递.

属性修饰符

属性修饰符目的:

  • 参数表示资源如何定位? 可以理解为端口
  • 在固定管线和可编程管线进行内建变量的传递
  • 将数据沿着渲染管线从顶点函数传递片元函数.
  1. 变量与参数的地址空间修饰符

Metal 着色语言使用"地址空间修饰符号",来表示一个函数变量或是参数 被分于那块内存区域. 下面这些修饰符描述了不相交叠地址空间:

  • device— 设备地址空间
  • threadgroup — 线程组地址空间
  • constant — 常量地址空间
  • thread — 线程地址空间
  1. 函数参数和变量

图形绘制或是并行计算着色函数的输入/输出都需要通过参数传递(除了常量地址空间变量和程序域中定义的采样器以外).参数可以是如下之一:

  • device buffer(设备缓存)
  • constant buffer(常量缓存)
  • texture Object(纹理对象)
  • sampler Object(采样器对象)
  • threadgroup(线程组 )
  1. 用于寻址缓存,纹理,采样器属性修饰符

为每个参数,指定一个属性修饰符. 指定明确的缓冲,纹理位置.

  • device 和 constant buffers — [[ buffer ( index ) ]]
  • texture — [[ texture ( index ) ]]
  • sampler — [[ sampler ( index ) ]]
  • threadgroup buffer — [[ threadgroup ( index ) ]]

纹理Textures

  • 纹理数据类型是一个句柄,它是一个一维/二维/三维纹理数据.而纹理数据对应这个一个纹理的某个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>
texture2d_ms<T,access a = access::read>
  • 带有深度的纹理必须被声明为下面纹理数据类型中的一个
enum class depth_forma {depth_float};
depth2d<T,access a = depth_format::depth_float>
depth2d_array<T,access a = access::sample,depth_format d = depth_format::depth_float>
depthcube<T,access a = access::sample,depth_format d = depth_format::depth_float>
depth2d_ms<T,access a = access::read,depth_format d = depth_format::depth_float>

采样器 Samplers

相关文章

网友评论

      本文标题:Metal Shading Language

      本文链接:https://www.haomeiwen.com/subject/qbfkkctx.html