Metal(一) 三角形绘制

1.Metal 简介Metal 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 “最接近硬件”)。优点:cpu 使用率低;Metal 将苹果的GPU 发挥最⼤性能;最⼤限度CPU/GPU 并发性;方便管理我们资源2. 函数解析2.1//每当视图改变方向或调整大小时调用 (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:
摘要由CSDN通过智能技术生成

1.Metal 简介

Metal 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 “最接近硬件”)。

优点:

  1. cpu 使用率低;
  2. Metal 将苹果的GPU 发挥最⼤性能;
  3. 最⼤限度CPU/GPU 并发性;
  4. 方便管理我们资源

2. 函数解析

2.1

//每当视图改变方向或调整大小时调用
 (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size;

2.2

//每当视图需要渲染帧时调用
- (void)drawInMTKView:(nonnull MTKView *)view

3. 绘制三角形

在这里插入图片描述
注:苹果官方建议Metal渲染类与ViewController类分开实现,所以下面我们在ViewController类中实现MTKView的加载,在Metal渲染类中实现渲染逻辑。

3.1创建并编辑Metal文件

  1. command + N --> Metal File 创建metal着色器文件
    在这里插入图片描述

  2. 定义顶点着色器输入和片元着色器输入,相当于OpenGL ES中的varying修饰的变量,即桥接变量。

// 顶点着色器输出和片段着色器输入
//结构体
typedef struct
{
   
    //处理空间的顶点信息
    float4 clipSpacePosition [[position]];

    //颜色
    float4 color;

} RasterizerData;

  1. 定义顶点着色器函数 和 片元着色器函数
//顶点着色函数
vertex RasterizerData
vertexShader(uint vertexID [[vertex_id]],
             constant Vertex *vertices [[buffer(VertexInputIndexVertices)]],
             constant vector_uint2 *viewportSizePointer [[buffer(VertexInputIndexViewportSize)]])
{
   
    /*
     处理顶点数据:
        1) 执行坐标系转换,将生成的顶点剪辑空间写入到返回值中.
        2) 将顶点颜色值传递给返回值
     */
    
    //定义out
    RasterizerData out; 

//    //初始化输出剪辑空间位置
//    out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);
//
//    // 索引到我们的数组位置以获得当前顶点
//    // 我们的位置是在像素维度中指定的.
//    float2 pixelSpacePosition = vertices[vertexID].position.xy;
//
//    //将vierportSizePointer 从verctor_uint2 转换为vector_float2 类型
//    vector_float2 viewportSize = vector_float2(*viewportSizePointer);
//
//    //每个顶点着色器的输出位置在剪辑空间中(也称为归一化设备坐标空间,NDC),剪辑空间中的(-1,-1)表示视口的左下角,而(1,1)表示视口的右上角.
//    //计算和写入 XY值到我们的剪辑空间的位置.为了从像素空间中的位置转换到剪辑空间的位置,我们将像素坐标除以视口的大小的一半.
//    out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);
    out.clipSpacePosition = vertices[vertexID].position;

    //把我们输入的颜色直接赋值给输出颜色. 这个值将于构成三角形的顶点的其他颜色值插值,从而为我们片段着色器中的每个片段生成颜色值.
    out.color = vertices[vertexID].color;

    //完成! 将结构体传递到管道中下一个阶段:
    return out;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值