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