Metal学习---入门

2019-02-19  本文已影响0人  水德之始CC

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


image.png

获取函数库并创建管道

顶点函数

顶点函数(顶点着色器)的主要任务是处理传入的顶点数据,并将每个顶点映射到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的大小。

未完待续~

上一篇下一篇

猜你喜欢

热点阅读