美文网首页
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