Metal名词:
MTKView MetalKitView 显示的view
MTLDevice 用来渲染的设备(又名GPU)
MTLCommandQueue 命令队列
vector_uint2 视图大小类型
MTLLibrary Metal库
MTLFunction 库中函数
MTLRenderPipelineDescriptor 管道状态管道
MTLRenderPipelineState 同步创建并返回渲染管线状态对象
MTLCommandBuffer 命令缓冲区
Metal渲染流程:
//1.获取GPU 设备
_device= mtkView.device;
//2.在项目中加载所有的(.metal)着色器文件
// 从bundle中获取.metal文件
id
//从库中加载顶点函数
id vertexFunction = [defaultLibrarynewFunctionWithName:@"vertexShader"];
//从库中加载片元函数
id fragmentFunction = [defaultLibrarynewFunctionWithName:@"fragmentShader"];
//3.配置用于创建管道状态的管道
MTLRenderPipelineDescriptor *pipelineStateDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
//管道名称
pipelineStateDescriptor.label=@"Simple Pipeline";
//可编程函数,用于处理渲染过程中的各个顶点
pipelineStateDescriptor.vertexFunction= vertexFunction;
//可编程函数,用于处理渲染过程中各个片段/片元
pipelineStateDescriptor.fragmentFunction= fragmentFunction;
//一组存储颜色数据的组件
pipelineStateDescriptor.colorAttachments[0].pixelFormat= mtkView.colorPixelFormat;
//4.同步创建并返回渲染管线状态对象
_pipelineState = [_device newRenderPipelineStateWithDescriptor:pipelineStateDescriptor error:&error];
//判断是否返回了管线状态对象
//5.创建命令队列
_commandQueue = [_device newCommandQueue];
//2-1. 顶点数据/颜色数据
staticconstCCVertextriangleVertices[] ;
//2-2.为当前渲染的每个渲染传递创建一个新的命令缓冲区
id
//指定缓存区名称
commandBuffer.label=@"MyCommand";
// 2-3MTLRenderPassDescriptor:一组渲染目标,用作渲染通道生成的像素的输出目标。
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
//2-4.创建渲染命令编码器,这样我们才可以渲染到something
id renderEncoder =[commandBufferrenderCommandEncoderWithDescriptor:renderPassDescriptor];
//渲染器名称
renderEncoder.label=@"MyRenderEncoder";
//2-5.设置我们绘制的可绘制区域
MTLViewportviewPort = {
0.0,0.0,_viewportSize.x,_viewportSize.y,-1.0,1.0
};
[renderEncodersetViewport:viewPort];
//2-6.设置当前渲染管道状态对象
[renderEncodersetRenderPipelineState:_pipelineState];
//2-7.从应用程序OC 代码 中发送数据给Metal 顶点着色器 函数
[renderEncodersetVertexBytes:triangleVertices
length:sizeof(triangleVertices)
atIndex:CCVertexInputIndexVertices];
//viewPortSize 数据
[renderEncoder setVertexBytes:&_viewportSize
length:sizeof(_viewportSize)
atIndex:CCVertexInputIndexViewportSize];
//2-8.画出三角形的3个顶点
[renderEncoderdrawPrimitives:MTLPrimitiveTypeTriangle
vertexStart:0
vertexCount:3];
//2-9.表示已该编码器生成的命令都已完成,并且从NTLCommandBuffer中分离
[renderEncoderendEncoding];
//2-10.一旦框架缓冲区完成,使用当前可绘制的进度表
[commandBufferpresentDrawable:view.currentDrawable];
//2-11.最后,在这里完成渲染并将命令缓冲区推送到GPU
[commandBuffercommit];
Metal文件里面的两个方法
//顶点着色函数
vertex RasterizerData
vertexShader(uintvertexID [[vertex_id]],
constantCCVertex*vertices [[buffer(CCVertexInputIndexVertices)]],
constantvector_uint2*viewportSizePointer [[buffer(CCVertexInputIndexViewportSize)]])
// 片元函数
fragmentfloat4fragmentShader(RasterizerDatain [[stage_in]])