CAMetalLayer 분석

1904 단어 iosmetal
CAMetal Layer는 Apple Core Animation Framework의 내부 모듈로, Metal Texture Pool을 관리하고 MTL Texture를 창에 렌더링합니다. 
CAMetalLayer 사용
device: MTLDevice 객체를 만들어야 합니다.
pixelFormat: MTLTExture의 픽셀 형식, 현재 MTLPixelFormatBGRA8Unorm 및 MTLPixelFormatBGRA8Unorm 지원sRGB 두 가지. 
코드 예:
-(instancetype)initWithCoder:(NSCoder *)aDecoder {
    if( self = [super initWithCoder:aDecoder] ){
        self.mDevice = MTLCreateSystemDefaultDevice();
        self.mCommandQueue = [self.mDevice newCommandQueue];
        
        self.metalLayer.device = self.mDevice;
        self.metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
    }
    
    return self;
}

     
framebuffer Only: YES means MTLTExture는 렌더링을 위해 특별히 최적화된 것으로 Texture에 대한 Read/Write/Sampling 등의 조작을 지원할 수 없으며 NO 반대입니다.Texture의 픽셀을 조작해야 하는 필연적인 이유가 없으면 YES로 설정해야 합니다
     
nextDrawable: 렌더링할 drawable 객체를 가져옵니다. 
코드 예:
    
    id<CAMetalDrawable> drawable = [self.metalLayer nextDrawable];
    id<MTLTexture> texture = drawable.texture;
    
    MTLRenderPassDescriptor  *passDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];
    passDescriptor.colorAttachments[0].texture = texture;
    passDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear;
    passDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore;
    passDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(1, 0, 1, 1);
    
    
    id<MTLCommandBuffer> commandBuffer = [self.mCommandQueue commandBuffer];
    id<MTLRenderCommandEncoder> commandEncoder = [commandBuffer renderCommandEncoderWithDescriptor:passDescriptor];
    
    [commandEncoder endEncoding];
    [commandBuffer presentDrawable:drawable];
    [commandBuffer commit];

Sample Code: 
https://github.com/volvet/metalDemo/tree/master/ClearTheScreen

좋은 웹페이지 즐겨찾기