日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Metal之简单渲染动态切换屏幕颜色

發布時間:2024/5/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Metal之简单渲染动态切换屏幕颜色 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

渲染循環

一、功能

管理metal的初始化以及metal中的視圖委托

  • initWithMetalKitView函數:初始化,需要傳入MTKView對象view獲取GPU的使用權限等
  • makeFancyColor函數:設置顏色,即隨著幀率變化的顏色
  • MTKViewDelegate協議
    drawableSizeWillChange代理方法:view大小發生變化時回調
    drawInMTKView代理方法:view需要渲染時回調

二、實現

① initWithMetalKitView函數
  • 渲染循環類對外的初始化方法,主要是通過傳入的view,獲取metal設備以及創建命令隊列;
  • 使用MTLCommandQueue去創建對象,并且加入MTLCommandBuffer對象中,確保它們能夠按照正確順序發送到GPU;
  • 對于每一幀,一個新的MTLCommandBuffer對象創建并且填滿了由GPU執行的命令;
// 初始化- (id)initWithMetalKitView:(MTKView *)mtkView {self = [super init];if(self) {// 設置device:device并不是新建的,是由傳入view在外創建,可以通過view獲取_device = mtkView.device;// 所有應用程序需要與GPU交互的第一個對象是一個對象:MTLCommandQueue// 使用MTLCommandQueue去創建對象,并且加入MTLCommandBuffer對象中,確保它們能夠按照正確順序發送到GPU// 對于每一幀,一個新的MTLCommandBuffer對象創建并且填滿了由GPU執行的命令_commandQueue = [_device newCommandQueue];} return self; }
② 設置動態顏色
// 設置顏色 - (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函數獲取當前幀顯示的顏色
Color color = [self makeFancyColor];
  • 設置view的清屏顏色,通過由MTLClearColorMake創建,相當于OpenGL ES中的glClearColor
view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha);
  • 創建渲染緩存區,目的是為了將渲染對象加入到渲染緩存區,使用MTLCommandQueue 創建對象并且加入到MTCommandBuffer對象中,且為當前渲染的每個渲染傳遞創建一個新的命令緩沖區
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];commandBuffer.label = @"MyCommand";
  • 獲取渲染描述修飾符,通過commandQueue獲取,類型是MTLRenderPassDescriptor,用于在commandBuffer中創建commandEncoder
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
  • 創建commandEncoder,通過渲染描述符renderPassDescriptor創建MTLRenderCommandEncoder 對象,即命令渲染編輯器,相當于OpenGL ES中的program,主要用途是用于繪制對象
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];renderEncoder.label = @"MyRenderEncoder";
  • 結束渲染編輯:當沒有需要繪制的任務時,即可結束MTLRenderCommandEncoder 工作
[renderEncoder endEncoding];
  • 渲染到屏幕上,添加一個最后的命令來顯示清除的可繪制的屏幕,當編碼器結束工作后,命令緩存區會收到兩個命令:
    present命令:渲染到屏幕上
    commit命令:將commandBuffer提交至GPU,主要是因為GPU不會直接渲染到屏幕上,如果不給命令,那么繪制的內容是不會顯示到屏幕上的
  • 完成渲染并將命令緩沖區提交給GPU,相當于OpenGL ES中的draw
[commandBuffer presentDrawable:view.currentDrawable];[commandBuffer commit];

ViewController

  • 獲取MTKView的對象view的方式有兩種,類似于GLKit中GLKView:可以在storyboard將view的類改為MTKView,可以創建MTKView對象,再將其添加到控制器的view中
// 獲取_view_view = (MTKView *)self.view;
  • 設置device: 主要是獲取GPU的使用權限,一個MTLDevice對象代表著一個GPU,一般使用默認方法MTLCreateSystemDefaultDevice來獲取默認的單個GPU對象,并且在創建完成后,需要判斷是否獲取GPU的使用權限,如果不成功,則中斷渲染流程
// 為_view 設置MTLDevice(必須)// 一個MTLDevice 對象就代表這著一個GPU,通常可以調用方法MTLCreateSystemDefaultDevice()來獲取代表默認的GPU單個對象_view.device = MTLCreateSystemDefaultDevice();// 判斷是否設置成功if (!_view.device) {NSLog(@"Metal is not supported on this device");return;}
  • 創建render: 在metal框架中,蘋果建議在開發mental程序時,最好是將渲染循環獨立成一個類,目的是為了更高的管理metal以及metal視圖委托。創建完成后,同樣需要判斷是否創建成功,如果不成功,則中斷渲染流程
// 創建CCRenderer// 分開渲染循環:在開發Metal程序時,將渲染循環分為自己創建的類,是非常有用的一種方式// 使用單獨的類,可以更好管理初始化Metal,以及Metal視圖委托_render =[[YDWRender alloc] initWithMetalKitView:_view];// 判斷_render 是否創建成功if (!_render) {NSLog(@"Renderer failed initialization");return;}
  • 設置view的delegate
// 設置MTKView 的代理(由CCRender來實現MTKView 的代理方法)_view.delegate = _render;
  • 設置幀速率: 在view中可以通過設置幀速率,不同的觸發試圖渲染,然后回調MTKViewDelegate中的drawInMTKView方法
// 視圖可以根據視圖屬性上設置幀速率(指定時間來調用drawInMTKView方法--視圖需要渲染時調用)_view.preferredFramesPerSecond = 60;

效果展示

完整示例

Metal之動態切換屏幕顏色

總結

以上是生活随笔為你收集整理的Metal之简单渲染动态切换屏幕颜色的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。