[iOS] Metal에서 GPU 컴퓨팅(12) MTLRenderPipelineState

이 기사는 Metal Advent Calendar2016의 17일째입니다.

지금까지 Metal의 GPU 컴퓨팅에 대해 해설 기사를 써 왔습니다.
[iOS] Metal에서 GPU 컴퓨팅 (1) 최소한의 코드 작성 및 특성 파악
[iOS] Metal에서 GPU 컴퓨팅 (2) 군지능
[iOS] Metal에서 GPU 컴퓨팅 (3) MTLDevice
[iOS] Metal에서 GPU 컴퓨팅 (4) MTKView
[iOS] Metal에서 GPU 컴퓨팅 (5) MTLLibrary
[iOS] Metal에서 GPU 컴퓨팅 (6) MTLCommandQueue
[iOS] Metal에서 GPU 컴퓨팅 (7) MTLCommandBuffer
[iOS] Metal에서 GPU 컴퓨팅 (8) MTLComputeCommandEncoder
[iOS] Metal에서 GPU 컴퓨팅 (9) MTLComputePipelineState
[iOS] Metal에서 GPU 컴퓨팅(10) Metal Shading Language로 기술된 라이프 게임 로직
[iOS] Metal에서 GPU 컴퓨팅(11) MTLRenderCommandEncoder
이 기사에서는 지난 번에 계속해서 Apple이 제공하는 샘플 코드에 대해 설명합니다.

취급하는 샘플 코드는, 전회와 같은 라이프게임의 앱, MetalGameOfLife입니다.
MetalGameOfLife


(실행 화면)

이번은, 샘플 코드내의 MTLRenderPipelineState 에 대해서 해설을 실시합니다.
MTLRenderPipelineState 는, 그리픽의 렌더링용의 파이프라인에 draw용의 함수나 정점의 설정등의 상태를 encode하기 위해서 사용됩니다.
컴퓨팅을위한 MTLComputePipelineState와 쌍을 이룹니다.
MTLRenderPipelineState는 클래스가 아닌 프로토콜로, MTLDevice의 객체에 의해 생성됩니다.
MTLRenderPipelineState의 객체 생성은 비용이 많이 들기 때문에 앱이 시작될 때 한 번 생성하면 충분합니다.

다시 말하지만, 이 샘플 코드는 주로 다음 파일로 구성되어 있습니다.

AAPLRender.h
AAPLRender.m
AAPLViewController.h
AAPLViewController.m
Sharder.metal

이 중 AAPLRender.m에는 병렬 컴퓨팅 및 드로잉의 CPU측의 로직이 Shader.metal에는 정점 셰이더, 프래그먼트 셰이더, GPU 컴퓨팅용 셰이더가 쓰여져 있습니다.

여기에서는 샘플 코드 내에서 MTLRenderPipelineState의 사용 부분을 설명합니다.
AAPLRender.m에는 다음 설명이 있습니다.

AAPLRender.m
@property (nonatomic, strong) id<MTLRenderPipelineState> renderPipelineState;
...
MTLRenderPipelineDescriptor *pipelineStateDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
pipelineStateDescriptor.label = @"Fullscreen Quad Pipeline";
pipelineStateDescriptor.vertexFunction = vertexProgram;
pipelineStateDescriptor.fragmentFunction = fragmentProgram;
pipelineStateDescriptor.vertexDescriptor = vertexDescriptor;
pipelineStateDescriptor.colorAttachments[0].pixelFormat = self.view.colorPixelFormat;
_renderPipelineState = [_device newRenderPipelineStateWithDescriptor:pipelineStateDescriptor error:&error];                                                                   

MTLRenderPipelineState 의 객체를 생성할 때는, MTLRenderPipelineDescriptor 를 개입시켜 정점 쉐이더의 함수, 단편 쉐이더의 함수, 정점의 설정, 픽셀 포맷을 지정합니다.

정점 셰이더의 함수, 단편 셰이더의 함수는 다음과 같이 MTLLibrary의 객체를 통해 MTLFunction의 객체 vertexProgram, fragmentProgram에 저장됩니다.

AAPLRender.m
    id<MTLFunction> vertexProgram = [_library newFunctionWithName:@"lighting_vertex"];
    id<MTLFunction> fragmentProgram = [_library newFunctionWithName:@"lighting_fragment"];

@"lighting_vertex 및 @"lighting_fragment"는 셰이더에 설명된 함수 이름입니다.

MTLRenderPipelineState 객체는 다음 위치에서 명령 인코더에 설정됩니다.

AAPLRender.m
[renderEncoder setRenderPipelineState:self.renderPipelineState];

이와 같이, MTLRenderPipelineState는 드로잉을 위한 다양한 설정을 인코딩하고 저장하는 역할을 담당하고 있습니다.

이번에는 라이프 게임의 샘플 코드 내에서 MTLRenderPipelineState의 해설을 실시했습니다.
다음 번 이후, 또 다른 개소에 대한 해설을 실시해 갑니다.

좋은 웹페이지 즐겨찾기