本案例的意图在于了解Metal中运用上色器制作三角形的流程

整体效果图如下

Metal-入门级02:制作三角形

整体的流程图如下

Metal-入门级02:制作三角形

与Metal 入门级01:色彩的烘托加载比较,viewDidLoad函数基本没改动,首要改动的是initWithMetalKitView函数和drawInMTKVopengl烘托gpu怎样设置iew署理办法

  • initWithMetalKitView函数:增加了me索引是什么意思tal上色器文件初始化的预备作业
  • drawIngitiMTKView署理办法:增加了metal制作三角形的流程

预备作业

创立metal文OpenGL

  • command + N –> Metal File 创立metal上色器文件

    Metal-入门级02:制作三角形

  • 界说极点上色器输入和片元上github色器输入,相当于OpenGL ES中的varying润饰的变量,即桥接变量

//极点上色opengl过错器输出和片元上色器github永久回家地址输入(相当于OpenGL ES中的varying润饰的变量,即桥接)
typedef strappleuct
{
//    处理空间缓存视频兼并的极点信息,相当于OpenGL ES中的gl_Position
//    flapplicationoat4 润饰符,是一个4维向量
float4 clipSpacePosition [[position]];
//    色彩,相当于OpenGL E缓存整理S中的gl_FragColor
float4 color;
}Rastopengl和directxerizerData;
  • 界说极点上色器函数 和 片元上色器函数
//极点上色器函数
/*
vertex:润饰符,标明是极点上色器
RasterizerData:回来值
vertexShadegitlabr:函数称谓,可自界说
vertex索引是什么意思ID:metal自己反应的id
vertices:1)奉告存储的方位buffer 2)奉告传递数据的进口是CJLVertexInputIndexVertices
vertices 和 viewportSi索引的效果及优缺点zePoin索引是什么意思ter 都是通过CJLRenderer 传递进来的
*/
vertex RasterizerData
vertexShaderopengl怎样装置与装备(uint vertexID [[vertex_id]],
constant CJLVertex *vertices [[buffer(CJLVertexInputIndexVertices)]],
constant vector_uint2 *viewappointmentport索引超出矩阵维度SizePointer [[buffer(CJLVertexInputIndexViewportSize)]])
{
}
/*
fragmeopengl怎样升级nt:润饰符,标明是片元上色器
float4:回来值,即色彩值RGBA
fragmentShader:函数称谓,可自界说
RasterizerData:参数类型(可修改)
in:形参变量(可修改)
[[stage_in]]:特色润饰符,标明单个片元输入(由定点函数输出)(不可修改),相当于OpenGL ES中的varying
*/
fragment float4 fragmentShader(RasterizerDagit指令ta in [[stage_in]])
{
}

创立C 与 OC的桥接文件

该头文件的意图是为了c代码与OC代码可以同享与 shader 和 C 代码 为了确保Metal Shader缓存区索引可以匹配 Metal API Buffer 设置的调集调用

  • 界说缓存区索引值,标明向metal上色器传递数据的进口枚举值,相当于OpenGL ES中GLSL言语界说的极点坐标进口position
typedef enum CJLVert缓存视频在手机哪里找exInputIndex
{
//    极点
CJLVertexInputIndexVertices = 0,
//    视图巨细
CJLVertexInput缓存视频兼并IndexViewportSize = 1,
}CJLVertexInputIndex;
  • 界说图形数据的结构体,包括极点和色彩值,类似于OpenGL ES中的极点数gitee据的结构体
/apple/结构体:极点/色彩值
typedef struc缓存的视频怎样保存到本地t
{
//    像素空间的方位
//    像素中心点(100,100)
vectorappointment_float4 position;
//    RGBA色彩
vector_float4 color;
}CJLVertex;

viewopengl是什么意思DidLoad函缓存视频兼并

这个函数的流程如下

Metal-入门级02:制作三角形

与Metappetiteal 入门级01:色彩的烘托加载比较,仅仅多了一个设置视口巨细,会触发MTKViewDelegate协议的drawableSizeWillChange办法,这儿不做过多阐明

烘托循环类opengl烘托gpu怎样设置

烘托循环类CJLRenopengl过错1281derer是服务于MTKView的,用于处理appreciateview缓存视频兼并app下载的烘托以及view的署理办法appstore的回调

initWithMetalKitView函数

这部分的代码都是制作前的预备作业,流程图如下

Metal-入门级02:制作三角形

首要分为是三步

  • 设置device
  • metal上色器文件加载
  • 设置指令队伍

opengl过错1281间第一步和第三步在上个案例均有提及,这儿不再阐明,首要说说metal上色器文件的加载

metal上色器文件加载

根据上图所示,可以划分为以下几步

  • 加载索引失效metal文索引有哪几种类型
    从bundle中获取metal后缀的上色器,并获取极点上色器和片元上github色器所对应的函数,其间函数的获取需求通过MTLLibrary政策根据对应的函数称谓获取
//2.在项目中加载悉数的(.metal)上色器文件
// 从bundle中获取.metal文件
id<appstoreMTLLibrary> defaultLibrary = [_device newDefaultLibrary];
//从库中加载极点函OpenGL数
id<缓存视频在手机哪里找MTLFunction> vertexFunction = [defaultLibrary newFunctionWithName:@"vertexShader"];
//从库中加载片元函数
id<MTLFunction> fragmentFunction = [defaultLibrary newFunctionWithName:@"fragmentShopengl烘托gpu怎样设置ader"];
  • 装备烘保管道
    通过MTLRenderPipelineDescrip缓存视频怎样转入本地视频tor初始化烘保管道,并设置管管称谓github中文官网网页、极点 & 片元上色器对应的函数以及存储色彩数据的组件
//3.装备用于创立appear管道状况的管道,即烘保管道
MTLRenderP索引失效的几种状况ipelineDescriptor *pipelineStateDescriptor = [[M缓存视频兼并TLRenderPipelineDescriptor alloc] inapp是什么意思it];
//管道称谓
pipelineStateDescrAPPiptor.label = @"Siapplicationmple Pipeline";
//可编程函数,用于处理烘托进程中的各个极点
pipelineStateDescriptor.verteopengl三重缓冲开不开xFunction = vertexF索引的效果及优缺点unction;
//可编程函数,用于处理烘托进程中各个片段/片元
pipelineStateDescriptorapp是什么意思.fragmentFunct索引有哪几种类型ion = fragme索引是什么意思nt索引的效果及优缺点Functionappreciate;
//一组存储色彩数据的组件
pipelineStateDescriptor.colorAtt索引失效achments[0].缓存视频兼并pixelFormat = mtkView.colorPixelFormat;
  • 创立烘保管线状况政策
    通过device和烘保管道创立烘保管线状况的政策,并判别是否创立成功
//4.同步创立并回来烘缓存视频保管线状况政策
_pipelineState = [_deopengl过错1281vice newRenderPipelineStateWithDescriptor:papp是什么意思ipelineStateDescriptgiteeor error:&error];
//判别是否回来了管线状况方opengl烘托gpu怎样设置针
if (!_pipelineState) {
//假如咱们没有正确设置管道描绘符,则管道状况OpenGL创立或许失利
NSLog(@git教程"Failed to created pipeline state, error %@", error);
return nil;
}

drawInMTopengl和directxKView署理办法

当view和render以及视口初始化后,MTKView政策view中默许的帧速率是60,与屏幕改写的帧率是共同的,所以会跟着屏幕改写的帧率,不断的调用该制作的署理办法

Metal-入门级02:制作三角形

该办法整体的流程如下

Metal-入门级02:制作三角形

比较色彩烘托的案例,多了metal制作三角形的流程,下面首要说下该流程,三角形的制作时在创立commandEncoder政策之后,完毕commandEncoder缓存是什么意思作业之前完毕的,且github永久回家地址在制作之前,需求在创立commandBuffer之前创立三角形的极点和色彩数据

//    1. 极点数据、色彩数据
static constgithub是干什么的 CJLVertex triangleVertices[] =
{
//极点, RGBA色彩值
{ {  0.5, -0.25, 0.0, 1.0 }, { 1, 0, 0, 1 } },
{ { -0.5,github是干什么的 -0.25, 0.0, 1.0 }, { 0, 1, 0, 1 } },
{ { -0.0f, 0.25,github 0.0, 1.0 }, { 0, 0, 1, 1 } },
}opengl版别过低怎样办;

三角形的制作首要分为以下几步:

  • 设置可制作的区域,即设置视口,相当gitee于OpenGL ES中的glViewPort
    • 通过MTLViewport创立视口政策
      视口首要用于指定Metal烘托内容的drawable区域。 视口是具有x和y偏移,宽度和高度以及近和远平面的3D区域

    • 为管道分配自界说视口需求通过调用setViewport
      办法将MTLViewport结构编码为烘托指令编码器。 假如未指定视口,Metal会设置一个默许视口,其巨细与用于创立烘托指令编码器的drawable相同。

MTLViewport viewPort = {    0.0,appearance 0.0, _viewportopengl怎样装置与装备Size.x, _viewportSize.y,app是什么意思 -1.0, 1.0};//设置视口 相当于OpenappleGL ES索引的效果及优缺点中的glViewPort[renderEncoder setViewport:viewPort];//6.设置当前烘保管道状况政策[renderEncoder setRe缓存整理nderPipelineState:_pipelineState];缓存视频怎样转入相册
  • 传递数据
    从app的OC代码中传递数索引的效果及优缺点据到Metal 极点上色器/缓存片元上色器 函数,,相当于OpenGL EapplicationS中的glVertexAttribPointer,目前需求传递的数据有两种

    • 极点+色彩数据
    • 视图巨细平数据
//   1) 指向要传递给上色器的内存的指针/apple/   2) 咱们想要传递的数据的内存巨细//   3)一个整数索引,它对应于咱们的“vertex索引是什么意思Shader”函数中的缓冲区特色限定符的索引。//        CJLVertexInputIndexVertices 是极缓存视频在手机哪里找点数appstore据的进口,需求由自己APP界说,相当于OpenGL ES中glGetAttribLocation[renderEncoder setVertexBytes:triangleVertices                       length:sizeof(triangleVertices)                      atIndex:CJLVertexInputIndexVertices];//viewPortSize 数据//1) 发送到极点上色函数中,视图巨细//2) 视图巨细内存空间巨细//3) 对应的opengl过错索引[rapproachen索引图deropengl版别过低怎样办Encoder setVertexBytes:&_viewportSize索引图                       length:sizeof(_viewportSize)                      atIndex:CJLVertexInputIndexViewportSizeapple];
  • git指令造三角形,相当于OpenGL ES中的glDrawArrays
    metal中gitee的图元有5种,OpenGappointmentL ES中则是有9种,m索引优化etal的图元类型如下表所示
图元类型 阐明
MTL索引是什么意思PrimitiveTypePoint = 0
MTLPrimitiveTypeLine = 1 线
MTLPrimitiveTypeLineStrip = 2 线环
MTLPrimitiveTypeTriangle = 3 三角形
MTLPrimitive缓存视频变成本地视频TypeTriangleStrip = 4 三角形扇
// @method drawPrimitives:v索引ertexStart:vertexCount://@brief 在不运用索引列表的状况下,制作图元//@param 制作图形组装的基元类型//@param 从哪个方位数据初步制作,一般缓存视频怎样转入相册为0//@param 每个图元的极点个数,制作的图型极点数量[renderEncopengl怎样装置与装备oder drawPrimitives:MTL索引符号PrimitiveTypeTriangle                  vertexgiti轮胎Start:0                  vertexCount:3]缓存视频怎样转入本地视频;

以上就是三角形的制作进程

完善metal上色器函数的代码

这部分运用的metal独有的语法,类似于OpenGL ES中的GLappreciateSL言语

其间me索引有哪几种类型tal中的图形烘保管opengles3.1扩展包道的关系如下所示:极点+色彩数据传入极点上色器,极点上色器处理极点,中心通过metal自行完毕的图github永久回家地址元装置和光栅化,将处理后的数据传入片元上色gitlab器进行处理

Metal-入门级02:制作三角形

极点上色器函数
首要有两部分处理缓存是什么意思

  • 极点:实施坐标系转化,将生成的极点编排空间写入到回来值中.
  • 色彩:缓存视频变成本地视频将极点色彩值传递给回来值
vertex RasterizerDatavertexShader(uint vertexID [[vertex_id]],gitee             constant CJLVertex *vertices [[bappearanceuffer缓存的视频怎样保存到本地(CJLVertexInputIndexVertices)]],             constant vector_ui索引符号nt2 *viewgiti轮胎portSizePointer [[buffer(CJLVertexInputIndexViewportSopengl和directxiappetitezopengl烘托gpu怎样设置e)]]){       //1、界说out    RasterizerData out;//    2、没有旋转等转换,原样索引失效的几种状况输出    //每个极点上色器的输出方位索引符号在编排空间中(也称为appear归一化设备坐标空间,NDC),编排空间中的(-1,-1)标明视口的左下角,而(1,1)标明视口的右上角.    out.clipSpacePosition = vertices[vertexappleID].position;    //把咱们输入的色彩直接赋值给输出色彩. 这个值将于构成三角形的极点的其他色彩值插值,从而为咱们片段上色器中的每个片段生成色彩值.    out.col索引有哪几种类型or = vertices[vertexID].color;    //完毕! 将结缓存构体传递到管道中下一个阶段:    return ou缓存视频兼并app下载t;}

片元上色器函数
原样输出色彩值

//当极点函数实施3次,三appear角形的每个极点实施一次后,则实施git指令管道中的下一个阶段.栅格化/光栅化./* metal自行完毕的进程 1)图元appearance装置 2)光栅化 *///片元上色器函数:描绘片元函数fragment float4 fragmentShader(RasterizerData in [[stappointmentage_in]]){    //回来输入的片元色彩    return in.color;}

完好的代码见Github –giti 17_Metal_三角形_OC

作者:Style_月月
链接:www.jianshu.c缓存视频怎样转入本地视频om/p/d94dcaa88…
来历:简书
著作权归作者悉数。商业转载请联络作者获得授权,非商业转载请注明出处。