Metal之简单渲染动态切换屏幕颜色
生活随笔
收集整理的這篇文章主要介紹了
Metal之简单渲染动态切换屏幕颜色
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
渲染循環(huán)
一、功能
管理metal的初始化以及metal中的視圖委托
- initWithMetalKitView函數(shù):初始化,需要傳入MTKView對(duì)象view獲取GPU的使用權(quán)限等
- makeFancyColor函數(shù):設(shè)置顏色,即隨著幀率變化的顏色
- MTKViewDelegate協(xié)議
drawableSizeWillChange代理方法:view大小發(fā)生變化時(shí)回調(diào)
drawInMTKView代理方法:view需要渲染時(shí)回調(diào)
二、實(shí)現(xiàn)
① initWithMetalKitView函數(shù)
- 渲染循環(huán)類對(duì)外的初始化方法,主要是通過(guò)傳入的view,獲取metal設(shè)備以及創(chuàng)建命令隊(duì)列;
- 使用MTLCommandQueue去創(chuàng)建對(duì)象,并且加入MTLCommandBuffer對(duì)象中,確保它們能夠按照正確順序發(fā)送到GPU;
- 對(duì)于每一幀,一個(gè)新的MTLCommandBuffer對(duì)象創(chuàng)建并且填滿了由GPU執(zhí)行的命令;
② 設(shè)置動(dòng)態(tài)顏色
// 設(shè)置顏色 - (Color)makeFancyColor {// 增加顏色/減小顏色的標(biāo)記static BOOL growing = YES;// 顏色通道值(0~3)static NSUInteger primaryChannel = 0;// 顏色通道數(shù)組colorChannels(顏色值)static float colorChannels[] = {1.0, 0.0, 0.0, 1.0};// 顏色調(diào)整步長(zhǎng)const float DynamicColorRate = 0.015;// 判斷if(growing) {// 動(dòng)態(tài)信道索引 (1,2,3,0)通道間切換NSUInteger dynamicChannelIndex = (primaryChannel+1)%3;// 修改對(duì)應(yīng)通道的顏色值 調(diào)整0.015colorChannels[dynamicChannelIndex] += DynamicColorRate;// 當(dāng)顏色通道對(duì)應(yīng)的顏色值 = 1.0if(colorChannels[dynamicChannelIndex] >= 1.0) {// 設(shè)置為NOgrowing = NO;// 將顏色通道修改為動(dòng)態(tài)顏色通道primaryChannel = dynamicChannelIndex;}} else {// 獲取動(dòng)態(tài)顏色通道NSUInteger dynamicChannelIndex = (primaryChannel+2)%3;// 將當(dāng)前顏色的值 減去0.015colorChannels[dynamicChannelIndex] -= DynamicColorRate;// 當(dāng)顏色值小于等于0.0if(colorChannels[dynamicChannelIndex] <= 0.0) {// 調(diào)整為顏色增加growing = YES;}}// 創(chuàng)建顏色Color color;// 修改顏色的RGBA的值color.red = colorChannels[0];color.green = colorChannels[1];color.blue = colorChannels[2];color.alpha = colorChannels[3];// 返回顏色return color; }③ drawInMTKView代理方法
通過(guò)view設(shè)置的幀速率,每當(dāng)?shù)街付〞r(shí)間時(shí),就會(huì)觸發(fā)view的渲染,繼而回調(diào)drawInMTKView代理方法進(jìn)行繪制渲染;
- 根據(jù)makeFancyColor函數(shù)獲取當(dāng)前幀顯示的顏色
- 設(shè)置view的清屏顏色,通過(guò)由MTLClearColorMake創(chuàng)建,相當(dāng)于OpenGL ES中的glClearColor
- 創(chuàng)建渲染緩存區(qū),目的是為了將渲染對(duì)象加入到渲染緩存區(qū),使用MTLCommandQueue 創(chuàng)建對(duì)象并且加入到MTCommandBuffer對(duì)象中,且為當(dāng)前渲染的每個(gè)渲染傳遞創(chuàng)建一個(gè)新的命令緩沖區(qū)
- 獲取渲染描述修飾符,通過(guò)commandQueue獲取,類型是MTLRenderPassDescriptor,用于在commandBuffer中創(chuàng)建commandEncoder
- 創(chuàng)建commandEncoder,通過(guò)渲染描述符renderPassDescriptor創(chuàng)建MTLRenderCommandEncoder 對(duì)象,即命令渲染編輯器,相當(dāng)于OpenGL ES中的program,主要用途是用于繪制對(duì)象
- 結(jié)束渲染編輯:當(dāng)沒(méi)有需要繪制的任務(wù)時(shí),即可結(jié)束MTLRenderCommandEncoder 工作
- 渲染到屏幕上,添加一個(gè)最后的命令來(lái)顯示清除的可繪制的屏幕,當(dāng)編碼器結(jié)束工作后,命令緩存區(qū)會(huì)收到兩個(gè)命令:
present命令:渲染到屏幕上
commit命令:將commandBuffer提交至GPU,主要是因?yàn)镚PU不會(huì)直接渲染到屏幕上,如果不給命令,那么繪制的內(nèi)容是不會(huì)顯示到屏幕上的 - 完成渲染并將命令緩沖區(qū)提交給GPU,相當(dāng)于OpenGL ES中的draw
ViewController
- 獲取MTKView的對(duì)象view的方式有兩種,類似于GLKit中GLKView:可以在storyboard將view的類改為MTKView,可以創(chuàng)建MTKView對(duì)象,再將其添加到控制器的view中
- 設(shè)置device: 主要是獲取GPU的使用權(quán)限,一個(gè)MTLDevice對(duì)象代表著一個(gè)GPU,一般使用默認(rèn)方法MTLCreateSystemDefaultDevice來(lái)獲取默認(rèn)的單個(gè)GPU對(duì)象,并且在創(chuàng)建完成后,需要判斷是否獲取GPU的使用權(quán)限,如果不成功,則中斷渲染流程
- 創(chuàng)建render: 在metal框架中,蘋(píng)果建議在開(kāi)發(fā)mental程序時(shí),最好是將渲染循環(huán)獨(dú)立成一個(gè)類,目的是為了更高的管理metal以及metal視圖委托。創(chuàng)建完成后,同樣需要判斷是否創(chuàng)建成功,如果不成功,則中斷渲染流程
- 設(shè)置view的delegate
- 設(shè)置幀速率: 在view中可以通過(guò)設(shè)置幀速率,不同的觸發(fā)試圖渲染,然后回調(diào)MTKViewDelegate中的drawInMTKView方法
效果展示
完整示例
Metal之動(dòng)態(tài)切換屏幕顏色
總結(jié)
以上是生活随笔為你收集整理的Metal之简单渲染动态切换屏幕颜色的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Swift之实现表格UITableVie
- 下一篇: Metal之渲染绘制三角形