[MetalKit]2-Using-MetalKit-part-1使用MetalKit1
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习.
MetalKit系统文章目录
MetalKit 框架是在 WWDC 2015 上发布的,它给原Metal框架带来了大量改进和新特性.认识 MTKView, NSView/UIView
的一个子类. 它内置了一个Metal layer层,也同时管理着帧缓冲器framebuffer及其渲染目标附件render target attachments,还管理着绘制循环draw loop.
让我们创建一个Cocoa Application
(因为iOS
模拟器不支持Metal
).确保只有Swift
和Use Strotyboards
区域是选中状态.接下来,创建一个新的类,名为MetalView.swift继承于NSView
(暂时).然后,到storyboard中选中View Controller
下面的View
,设置Identity Inspector
中的类为MetalView
类型,如下图.
对View Controller
也是同样操作,删除Identity Inspector
中Class
下面的View Controller
,因为我们用不到它.删除ViewController.swift
因为我也不需要它了.现在回到MetalView.swift
文件中,输入import MetalKit.有两种方法可以让我们的类支持绘制:遵守MTKViewDelegate
协议并实现它的drawInView(:)
方法,或者继承MTKView
并重写它的drawRect(:)
方法.这里我们选择后者,所以将类的类型从NSView
改为MTKView,并创建一个新方法名为render()
,内容如下:
func render() {let device = MTLCreateSystemDefaultDevice()!self.device = devicelet rpd = MTLRenderPassDescriptor()let bleen = MTLClearColor(red: 0, green: 0.5, blue: 0.5, alpha: 1)rpd.colorAttachments[0].texture = currentDrawable!.texturerpd.colorAttachments[0].clearColor = bleenrpd.colorAttachments[0].loadAction = .Clearlet commandQueue = device.newCommandQueue()let commandBuffer = commandQueue.commandBuffer()let encoder = commandBuffer.renderCommandEncoderWithDescriptor(rpd)encoder.endEncoding()commandBuffer.presentDrawable(currentDrawable!)commandBuffer.commit()
}
复制代码
让我们一行一行来细看这些代码.首先,我们创建一个device.我们将其设置为我们view的属性device
,否则该属性为nil
程序会崩溃.作为一个可选项,我们可以在绘制之前修改view的drawable
属性.接着,创建一个render pass descriptor(渲染通道描述符) 以便我们配置渲染通道为current drawable’s texture
附着上初始颜色.为了有趣一点,我们创建一个很棒的颜色,由一半蓝色一半绿色组成,叫bleen.最后,我们使用命令缓冲器来创建render command encoder来执行绘制命令.对于每个绘制循环,当currentRenderPassDescriptor
查询时,创建一个新的MTLRenderPassDescriptor
对象.这个对象是基于currentDrawable
对象创建的.画面显示并不是MTKView
处理的,所以我们必须自己先检查currentRenderPassDescriptor
和currentDrawable
都为为nil
,然后再调用presentDrawable(:)
方法.
让我们参考一下Metal 文档中的细节.Metal
框架包含若干对象:
device设备
-对GPU
的抽象,处理命令队列中的渲染和计算命令command queue命令队列
-一个命令缓冲器的串行队列,确保储存的命令按顺序执行command buffer命令缓冲器
-储存从命令编码器中编译出的指令.当能问执行完所有命令后Metal会通知应用程序.command encoder命令编码器
-将API
命令编译成GPU
硬件命令-共有三种类型的编码器:render
(供图形渲染),compute
(供数据并行处理)及blit
(供资源复制操作).目前我们只需关注render command encoder渲染命令编码器
states状态
-例如混合和深度shaders着色器
-源码resources资源
-纹理和数据缓冲器
我们在本系列的下一节中将讨论最后3个对象.当前我们只关注device
,queue
,buffer
和encoder
.Render Command Encoder (RCE)渲染命令编码器
为每一个单独的渲染通道提供硬件命令,这意味着所有的渲染都被送入一个单一的framebuffer帧缓冲器
对象中(目标集合中).如果另一个帧缓冲器需要被渲染,会创建一个新的RCE.RCE会为从graphics popeline图形管线
中给出的vertex顶点
和fragment片段
确定状态,并且插入resources
,state changes
和draw calls
.利用RCE
的一个优点是无需绘制时编译;应用可以决定编译和状态检查何时发生,这样为程序员提供了很大的性能优势.
让我们再回到我们的代码.在drawRect(:) 方法中调用render()
方法:
override func drawRect(dirtyRect: NSRect) {super.drawRect(dirtyRect)render()
}
复制代码
如果你运行应用,你将会看到一个漂亮的,纯粹的bleen-ish
屏幕:
在下一节中,我们终于开始介绍shaders
,加载textures
及管理model data模型数据
.代码 source code 发布于Github
上.
下次见!
[MetalKit]2-Using-MetalKit-part-1使用MetalKit1相关推荐
- [MetalKit]34-Working-with-memory-in-Metal内存管理
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 今天我们关注一下使用GPU时的内存管理.Metal框架将内存资源定义为MTLBuff ...
- [MetalKit]14-Ray-tracing-in-a-Swift-playground5射线追踪5
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 让我们继续上周的工作完成ray tracer射线追踪器.现在我们知道如何生成不同材料 ...
- [MetalKit]47-Introducing Metal 3 Metal 3简介
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 上周在WWDC 2019上宣布了Metal 3,Apple公布了相关数字: Meta ...
- [MetalKit]7-Using-MetalKit-part-6使用MetalKit6
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 让我们来看看新的MetalKit框架和以前的Metal框架有什么不同.它们是同时共存 ...
- [MetalKit]32-Shadows-in-Metal-part-2阴影2
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 在本系列的第二部分中,我们将学习soft shadows软阴影.我们将使用在Raym ...
- [MetalKit]45-Using eGPUs with Metal 在 eGPU上使用 Metal
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 对于那些像我一样需要原生 GPU 性能,却只有一个笔记本电脑,又不想再买一个台式机的 ...
- [MetalKit]33-Ambient-Occlusion-in-Metal环境光遮蔽
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 今天我们将学习ambient occlusion环境光遮蔽.我们将使用Shadows ...
- [MetalKit]17-Using-MetalKit-part-11使用MetalKit11
本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习. MetalKit系统文章目录 让我们用Metal Shading Language (MSL)继续我们在神奇的着色 ...
- iOS 9官方文档(翻译)
iOS9已经发布一段时间了,我也在最近升级了Xcdoe 7.0正式版,升级后才发现又有了很多奇妙的变化,于是查看官方文档的一些解释,顺便做了一些翻译,和大家分享一下(转载请注明出处). iPad多任务 ...
最新文章
- 点石关键词排名优化软件_关键词点击排名优化
- 【数据结构】单链表的逆序输出(两种方法)
- java bitmap base64_Android Bitmap到Base64字符串
- mysql 让别人连接我的数据库
- 详解虚函数的实现过程之菱形继承修罗场(6)
- net start mysql 发生系统错误 5。 拒绝访问。
- impala元数据放到mysql_impala系列: 同步Hive元数据和收集统计信息
- 哈工大成立人工智能研究院,NLP全国第三
- 2017.4.20 火星人 思考记录
- Linux c实现一个tcp文件服务器和客户端
- delete响应服务器,rest-RESTful-DELETE响应主体应包含什么
- qlistwidgetitem itempressed怎么区分左右键_那个帮你把魂斗罗玩通关的男人,去世了!那年暑假的“上上下下左右左右BABA”,你还记得吗?...
- pycharm和python解释器安装
- 必须知道的python专属骚技巧25例
- python cls方法_Python 中的 __new__(cls)方法详解
- WEB前端知识大整合之JS表单验证
- JAVA中dot的用法_doT学习(一)之语法
- 学习日记--overflow去掉滑条
- linux rm 文件找回_linux rm -rf * 文件恢复记
- 简单实用的pandas技巧:如何将内存占用降低90%