本案例的意图在于了解Metal中运用上色器制作三角形的流程
整体效果图如下
整体的流程图如下
与Metal 入门级01:色彩的烘托加载比较,viewDidLoad函数基本没改动,首要改动的是initWithMetalKitView
函数和drawInMTKVopengl烘托gpu怎样设置iew
署理办法
- initWithMetalKitView函数:增加了me索引是什么意思tal上色器文件初始化的预备作业
-
drawIngitiMTKView
署理办法:增加了metal制作三角形的流程
预备作业
创立metal文OpenGL件
//极点上色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函缓存视频兼并数
这个函数的流程如下
与Metappetiteal 入门级01:色彩的烘托加载比较,仅仅多了一个设置视口巨细,会触发MTKViewDelegate
协议的drawableSizeWillChange
办法,这儿不做过多阐明
烘托循环类opengl烘托gpu怎样设置
烘托循环类CJLRenopengl过错1281derer
是服务于MTKView
的,用于处理appreciateview缓存视频兼并app下载的烘托以及view的署理办法appstore的回调
initWithMetalKitView函数
这部分的代码都是制作前的预备作业,流程图如下
首要分为是三步
- 设置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制作三角形的流程,下面首要说下该流程,三角形的制作时在创立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器进行处理
极点上色器函数
首要有两部分处理缓存是什么意思
- 极点:实施坐标系转化,将生成的极点编排空间写入到回来值中.
- 色彩:缓存视频变成本地视频将极点色彩值传递给回来值
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…
来历:简书
著作权归作者悉数。商业转载请联络作者获得授权,非商业转载请注明出处。