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