美文网首页
Metal学习---入门

Metal学习---入门

作者: 水德之始CC | 来源:发表于2019-02-19 15:43 被阅读0次

    MetalKit框架在2015年WWDC上发布,它为Metal带来了很多改进和新特性。Metal允许开发人员直接在GPU上执行图形渲染和并行计算。在Metal之前,iOS上用于图形渲染的框架还是OpenGL ES。


    image.png
    • MTLDevice对象表示的GPU,通常通过MTLCreateSystemDefaultDevice()获取。
    • MTLCommandBuffer是存储编码命令以供GPU执行的缓冲区,MTLCommandBuffer会提供一些encoder,用于渲染的MTLRenderCommandEncoder,用于计算的MTLComputeCommandEncoder,用于缓存纹理拷贝指令的MTLBlitCommandEncoder。每一帧都会产生一个MTLCommandBuffer对象,用于填放指令,对于每一帧(MTLCommandBuffer)来说,只有调用encoder的操作结束,才能进行下一个encoder的创建,同时可以设置执行完指令的回调。
    • MTLCommandQueue是命令队列,用于创建和组织MTLCommandBuffer,保证MTLCommandBuffer能有序地发送到GPU。
    • MTLRenderPassDescriptor是一个轻量级的临时对象,具有许多可配置属性,供MTLCommandBuffer创建MTLRenderCommandEncoder对象用。
    • MTLRenderCommandEncoder在创建的时候,会隐式的调用一次clear的命令。
      encoder完成编码后,commandBuffer接受两个最终的命令:present和commit。
    • MTLViewport是metal的可绘制区域,具有x和y偏移量、宽度和高度以及近平面和远平面的3D区域。
    • MTLRenderPipelineState表示渲染管道,最主要的三个过程:顶点处理、光栅化、片元处理。

    获取函数库并创建管道

    顶点函数

    顶点函数(顶点着色器)的主要任务是处理传入的顶点数据,并将每个顶点映射到viewport中的一个位置。这样,管道中的后续阶段可以引用这个viewport位置,并将像素呈现到drawable中的确切位置。顶点函数通过将任意顶点坐标转换为规范化的设备坐标(也称为clip-space坐标)来完成此任务。

    image.png

    下面苹果官方文档的demo中的.metal文件,绘制一个五彩斑斓的三角形。

    #include <metal_stdlib>
    #include <simd/simd.h>
    
    using namespace metal;
    
    #import "AAPLShaderTypes.h"
    
    typedef struct
    {
        float4 clipSpacePosition [[position]];
        float4 color;
    
    } RasterizerData;
    
    vertex RasterizerData
    vertexShader(uint vertexID [[vertex_id]],
                 constant AAPLVertex *vertices [[buffer(AAPLVertexInputIndexVertices)]],
                 constant vector_uint2 *viewportSizePointer [[buffer(AAPLVertexInputIndexViewportSize)]])
    {
        RasterizerData out;
        out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);
        float2 pixelSpacePosition = vertices[vertexID].position.xy;
        vector_float2 viewportSize = vector_float2(*viewportSizePointer);
    
        out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);
    
        out.color = vertices[vertexID].color;
    
        return out;
    }
    
    fragment float4 fragmentShader(RasterizerData in [[stage_in]])
    {
        return in.color;
    }
    

    vertexShader是顶点处理函数。ResterizerData是一个返回给片元着色器的结构体,[[position]]修饰符表示clipSpacePosition是顶点位置。[[vertex_id]]属性限定符是顶点函数每次执行的顶点的索引,用于定位当前的顶点,当绘制调用这个顶点函数时,这个值从0开始,每次调用都会增加。第二个参数vertices是包含顶点(AAPLVertex类型)的数组。第三个参数viewportSizePointer表示viewport的大小。

    未完待续~

    相关文章

      网友评论

          本文标题:Metal学习---入门

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