Projects/Metal - Document
Metal-cpp 05 : Render 3D with Perspective Projection
아헿헿헿
2022. 8. 25. 13:18
이전까지는 2D를 다루었기에, 3D로 넘어오면서 중요한 것은 뒤에 위치하는 물체가 앞 쪽의 물체에 의해서 가려진다는 점입니다. 이를 해결하기 위해서는 Depth Buffer와 Stencil Buffer를 사용합니다.
void Renderer::buildDepthStencilStates()
{
MTL::DepthStencilDescriptor* pDsDesc = MTL::DepthStencilDescriptor::alloc()->init();
pDsDesc->setDepthCompareFunction( MTL::CompareFunction::CompareFunctionLess );
pDsDesc->setDepthWriteEnabled( true );
_pDepthStencilState = _pDevice->newDepthStencilState( pDsDesc );
pDsDesc->release();
}
파이프라인이 삼각형을 처리하기 fragment 단계로 넘어갈 때, depthCompareFunction의 속성을 이용하여 거리를 재어, 이를 사용할 지 제거할 지를 결정합니다. CompareFunctionLess로 설정하면 렌더러는 더 가까운 경우만 남깁니다. depthWrite를 활성화하면 파이프라인은 향후 비교를 위해 픽셀의 깊이 값을 업데이트합니다.
pEnc->setCullMode( MTL::CullModeBack );
pEnc->setFrontFacingWinding( MTL::Winding::WindingCounterClockwise );
이는 draw를 호출할 때, 폴리곤이 감긴 방향을 따라 후면에 해당하는 부분을 제거하게 합니다.