텍스처를 사용하여 PRT 표현(Direct3D 9)
DirectX SDK에 포함된 PRTDemo 샘플 및 PRTCmdLine 시뮬레이터는 메시의 꼭짓점에서 전송 벡터를 나타냅니다. PRT 신호를 정확하게 나타내기 위해서는 현재 게임에 비실용적일 수 있는 테셀레이션이 필요할 수 있습니다. 텍스처 맵에서 전송 벡터를 나타내는 것은 메시 복잡성과 관계없이 동일한 데이터 비용을 가지는 대체 방법입니다. D3DX PRT 라이브러리를 사용하여 전송 벡터 텍스처 맵을 생성하는 방법에는 여러 가지가 있습니다.
한 가지 방법은 PRTDemo 및 PRTCmdLine 샘플을 수정하여 표면의 매개 변수화에 있는 모든 텍셀에서 전송 벡터를 계산하는 것입니다. 가상 하드 디스크 파일에 대한 중요 정보를 제공하려면
- D3DXCreatePRTEngine 호출을 수정하여 메시에서 텍스처 좌표를 추출합니다(ExtractUV는 TRUE여야 합니다).
- 동일한 텍스처 크기를 사용하여 D3DXCreatePRTBuffer 호출을 D3DXCreatePRTBufferTex 로 바꿉니다.
ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSSS 및 ComputeDirectLightingSHAdaptive를 제외한 모든 ID3DXPRTEngine 메서드는 텍셀별 시뮬레이션에서 작동합니다. 텍스처 공간 시뮬레이션은 올바른 결과를 생성하지만 전송 벡터를 고밀도로 계산할 가능성이 높기 때문에 상당히 느릴 수 있습니다.
또 다른 방법은 꼭짓점당 적응형 PRT 시뮬레이션(텍셀당 데이터에 사용되는 텍스처 좌표 사용)을 계산한 다음 ID3DXPRTEngine::ResampleBuffer 를 호출하는 것입니다(적절한 해상도에서 D3DXCreatePRTBufferTex 를 사용하여 만든 출력 버퍼 사용). 이는 SDK의 모든 D3DX PRT 기능에서 작동하며 텍셀당 전송 버퍼를 직접 계산하는 것보다 훨씬 더 효율적일 수 있습니다.
단일 클러스터를 사용하는 경우 다른 텍스처와 같이 결과를 필터링하고 밉 매핑할 수 있으며 픽셀 셰이더는 PRTDemo와 함께 제공되는 꼭짓점 셰이더 코드와 동일합니다.
압축에서 여러 클러스터를 생성하는 경우 클러스터링 인덱스가 연속되지 않으므로 데이터를 필터링하거나 밉맵할 수 없습니다. 다중 클러스터 데이터를 처리하기 위한 몇 가지 대안은 다음과 같습니다.
- 픽셀 셰이더에서 모든 필터링을 직접 수행합니다. 아쉽게도 일반적으로 성능상의 이유로 비실용적입니다.
- 텍스처가 낮은 해상도의 밉 매핑되지 않은 텍스처(예: 라이트 맵)인 경우 필터링이 발생하지 않는 텍스처 공간에서 직접 조명을 계산하고 음영 처리된 텍스처로 개체를 렌더링하는 것이 더 효율적일 수 있습니다. 기본적으로 GPU에서 완전히 생성된 동적 조명 맵입니다.
- 텍스처 아틀라스를 사용하는 경우( UVAtlas 사용(Direct3D 9 참조) 텍스처 공간의 연결된 구성 요소에 있는 모든 전송 벡터가 동일한 클러스터에 있어야 하여 장면을 수동으로 클러스터링할 수 있습니다. 이렇게 하면 액세스하는 모든 텍셀이 생성에 의해 동일한 클러스터에 있기 때문에 텍스처를 필터링할 수 있습니다. 지정된 얼굴의 클러스터 ID가 꼭짓점 셰이더에서 전파될 수 있습니다.
픽셀 셰이더는 인덱싱할 수 없는 상수 레지스터가 훨씬 적으므로 픽셀 셰이더는 꼭짓점 셰이더와 다소 다릅니다. 클러스터당 작업을 저해상도 동적 텍스처에 저장하고 텍스처 로드를 사용하는 것이 여러 클러스터를 사용할 때 렌더링하는 가장 효율적인 방법입니다.