MTLRenderPipelineDescriptor

Horus-iOS·2022년 7월 12일
0

https://developer.apple.com/documentation/metal/mtlrenderpipelinedescriptor

An argument of options you pass to a device to get a render pipeline state object.

렌더 파이프라인 상태 객체를 가져오기 위해 디바이스로 보내는 옵션의 인자입니다.

Declaration

class MTLRenderPipelineDescriptor : NSObject

Overview

MTLRenderPipelineDescriptor 객체는 렌더링 패스 중에 사용하기 위한 렌더링 설정 상태를 구체화합니다. 래스터화(멀티샘플링과 같은), 가시성, 혼합, 테셀레이션 및 그래픽 기능 상태를 포함합니다. MTLRenderPipelineDescriptor 객체를 생성하려면 표준 할당 및 초기화 테크닉을 사용하시기 바랍니다. 이후 MTLRenderPipelineState 객체를 생성하기 위해 설명자(descriptor)를 설정하고 사용하시기 바랍니다.

렌더링 파이프라인 설명자에서 버텍스 혹은 프래그먼트 함수를 구체화하려면 바람직한 MTLFunction 객체에vertexFunctionfragmentFunction 속성을 각각 설정해야 합니다. 후처리 테셀레이션 버텍스 함수에vertexFunction 속성을 설정하지 않으면 시스템은 테셀레이션 단계 속성들을 무시합니다. [[ patch(patch-type, N) ]] 특성이 메탈 셰이딩 언어 소스에서 함수의 시그니처보다 우선한다면, 버텍스 함수는 후처리 테셀레이션 버텍스 함수입니다. Metal Shading Language Specification에서 "Post-Tessellation Vertex Functions" 섹션을 참고하시기 바랍니다.

Metal Shading Language Specification
https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf

fragmentFunction 속성을 nil로 설정하는 것은 픽셀의 래스터화를 색상 부착으로 하는 것을 불가능하게 합니다. 이 액션은 보통 버텍스 함수 데이터 출력을 버퍼 객체 혹은 깊이만 갖는 렌더링을 위한 것입니다.

버텍스 셰이더에 버텍스별 인풋 특성을 나타내는 인수가 있는 경우 버텍스 데이터의 조직을 설명할 수 있도록vertexDescriptor 속성을 MTLVertexDescriptor 객체에 설정하시기 바랍니다.

Multisampling and the Render Pipeline

색상 부착이 멀티샘플링(부착은 필수적으로 MTLTextureType.type2DMultisample 타입 색상 텍스처여야)을 지원하는 경우 개별 프래그먼트당 다중 샘플을 생성할 수 있고, 아래 렌더링 파이프라인 설명자 속성들이 다음을 결정하도록 할 수도 있습니다.

  • sampleCount는 각 픽셀별 샘플의 수입니다.
  • isAlphaToCoverageEnabledtrue이면, GPU는 GPU가 모든 부착(색상, 깊이, 원판)에 쓰려고 하는 값에 영향을 미치는 커버리지 마스크 연산을 위한colorAttachments에 색상 부착을 위한 알파 채널 프래그먼트 아웃풋을 사용합니다.
  • isAlphaToOneEnabledtrue인 경우 colorAttachments에 대한 알파 채널 프래그먼트 값을 1.0으로 변경하며, 나타낼 수 있는 값의 가장 큰 수입니다..

isAlphaToOneEnabledtrue라면, 구현에서 결정된 coverageToMask는 플롯 포인트의 값에 비율로 아웃풋에 있는 비트의 수를 설정하는 중간 단계의 커버리지 마스크를 생성하기 위해서 colorAttachments로부터 알파 채널 프래그먼트 아웃풋을 사용합니다. 예를 들어 인풋이 0.0f인 경우 함수는 아웃풋을 0x0으로 설정합니다. 인풋이 1.0f인 경우 함수는 모든 아웃풋 비트(~0x0)를 설정합니다. 인풋이 0.5f라면 함수는 구현에 따라 비트의 절만만 설정하며, 보통 디더 패턴으로 사용합니다.

마지막 커버리지 마스크를 결정하려면 함수는 래스터라이저와 프래그먼트 셰이더의 마스크를 사용해서 최종 커버리지 마스크에 alphaCoverageMask 논리적 AND를 수행합니다. 아래 코드와 유사합니다.

Listing 1 Pseudo-code for computing a coverage mask

if (alphaToCoverageEnabled) then
    alphaCoverageMask = coverageToMask(colorAttachment0.alpha);
finalCoverageMask = originalRasterizerCoverageMask
                  & alphaCoverageMask & fragShaderSampleMaskOutput;

0개의 댓글