Metal 基本任务和概念 - 02

使用金属绘制视图内容

创建一个MetalKit视图和一个渲染过程以绘制视图的内容。

概述

在此示例中,您将学习使用Metal渲染图形内容的基础。您将使用MetalKit框架创建一个使用Metal绘制视图内容的视图,然后,您将编码用于渲染过程的命令,该过程会将视图擦除为背景色。

笔记
MetalKit自动执行窗口系统任务,加载纹理并处理3D模型数据。有关更多信息,请常见MetalKit.

准备要绘制的MetalKit 视图

MetalKIt 提供了一个名为MTKView类。它是NSView(在macOS中)或UIView(在iOS 和 tvOS中)的子类。MTKView处理与将您使用Metal绘制的内容显示到屏幕上有关的许多细节。

MTKView 需要引用Metal设备对象在内部创建资源,因此第一步是将视图的device属性设置为MTLDevice.

其它属性MTKView 允许您控制其行为。要将视图的内容擦出为纯背景色,请设置clearColor属性,您可以使用MTLClearColorMake(:::)函数创建颜色,并指定红色,绿色,蓝色和alpha值.

_view.clearColor = MTLClearColorMake(0.0,0.5,1.0,1.0);

因为在此示例中您将不会绘制动画内容,所以请配置视图,以便仅在需要更新内容时(例如,视图改变形状时)才绘制视图:

 _view.enableSetNeedsDisplay = YES;

委托图纸责任

MTKView 依靠您的应用向Metal发出命令以生成视觉内容,MTKView 使用委托模式来通知您的应用何时应绘制,要接受委托回调,请将视图的delegate属性设置为符合协议的对象,

_view.delegate =  _renderer;

该委托实现两种方法:

  • 每当内容大小更改时,视图都会调用mtkView(_:drawableSizeWillChange:)该方法,当调整包含视图窗口的大小或更改设备方向(在ios上)时,会发生这种情况,这使您的应用可以根据视图的大小调整其呈现的分辨率。
  • draw(in:) 每当需要更新视图内容时,视图就会调用该方法,在这种方法中,您将创建命令缓冲区,对告诉GPU绘制内容以及何时在屏幕上显示的命令进行编码,并排队该命令缓冲区以供GPU执行,有时这称为绘制框架您可以将框架视为产生单个图像并显示在屏幕上的所有工作,在像游戏这样的交互式应用程序中,您可能每秒绘制很多帧。

在此示例中,名为AAPLRender类实现委托犯法并承担绘制的责任,视图控制器创建此类的实例,并将其设置为视图的委托。

创建渲染过程描述符

绘制时,GPU将结果存储在纹理中,纹理是包含图像数据的内存快。,GPU可以访问它们。在此示例中,将MTKView创建您需要绘制到视图中的所有纹理。它创建多个纹理,以便在渲染到另一个纹理时可以显示一个纹理的内容。

要进行绘制,请创建一个RenderPass,这是一系列绘制命令可以绘制成一组纹理,在渲染过程中使用时,纹理也称为渲染目标要创建渲染过程,您需要一个渲染过程描述符,即MTLRenderPassDescriptor的实例,在此示例中,无需配置自己的渲染过程描述符,而是请MetalKit视图为您创建一个。

MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
if (renderPassDescriptor == nil ){
   return;
}

渲染过程描述符描述了渲染目标的集合,以及在渲染过程的开始和结束时应如何处理它们。渲染过程还定义了一些其它方面的渲染,这些方面不属于本示例。视图返回带有单个颜色附件的渲染过程描述符,该描述符指向纹理之一,否则将基于视图的属性配置渲染过程。默认情况下,这意味着在渲染过程开始时,渲染目标被擦除为与视图属性匹配的颜色,并且在渲染过程结束时,所有更改都被存储回纹理。

由于视图的渲染过程描述符可能时nil,因此nil在创建渲染过程之前,应进行测试以确保渲染过程描述符对象为非对象。

创建渲染通行证

您可以通过使用MTLRenderCommandEncoder对象将渲染过程编码到命令缓冲区中来创建渲染过程。调用命令缓冲区的方法makeRenderCommandEncoder(descriptor:)并传入渲染过程描述符。

id  commandEncoder = [commandBuffer renderCommandEncoderWithDescriptor:descriptor];

在此示例中,您不对任何绘图命令进行编码,因此渲染过程唯一要做的就是擦除纹理。调用编码器的方法endEncoding以指示通过已完成。

[commandEncoder endEncoding];

在屏幕上显示一个可绘制对象

绘制到纹理不会自动在屏幕上显示新内容。实际上,只有一些纹理可以显示在屏幕上。在Metal中,可以在屏幕上显示的纹理由可绘制对象管理,要显示内容,请显示可绘制对象。

MTKView 自动创建可绘制对象以管理其纹理读取currentDrawable属性以获得具有纹理的可绘制对象,该纹理是渲染通道的目标。该视图返回一个CAMetalDrawable对象,该对象连接到Core Animation。

id  drawable = view.currentDrawable;

调用present(_:)命令缓冲区中的方法,并传入drawable;

[commandBuffer presentDrawable:drawable];

此方法告诉Metal,计划执行命令缓冲区时,Metal应该与Core Animation 协调以在渲染完成后显示纹理当Core Animation 呈现纹理时,它将成为视图的新内容。在此示例中,这意味着删除的纹理成为该视图的新背景。该更改与Core Animation 对屏幕用户界面元素所做的任何其它视觉更新同时进行。

提交命令缓冲区

现在,您可以为框架发出了所有命令,请提交命令缓冲区

[commandBuffer commit];

你可能感兴趣的:(Metal 基本任务和概念 - 02)