텍스처를 사용하여 PRT 표현(Direct3D 9)

DirectX SDK에 포함된 PRTDemo 샘플 및 PRTCmdLine 시뮬레이터는 메시의 꼭짓점에서 전송 벡터를 나타냅니다. PRT 신호를 정확하게 나타내기 위해서는 현재 게임에 비실용적일 수 있는 테셀레이션이 필요할 수 있습니다. 텍스처 맵에서 전송 벡터를 나타내는 것은 메시 복잡성과 관계없이 동일한 데이터 비용을 가지는 대체 방법입니다. D3DX PRT 라이브러리를 사용하여 전송 벡터 텍스처 맵을 생성하는 방법에는 여러 가지가 있습니다.

전송 벡터 사전 계산

한 가지 방법은 PRTDemo 및 PRTCmdLine 샘플을 수정하여 표면의 매개 변수화에 있는 모든 텍셀에서 전송 벡터를 계산하는 것입니다. 가상 하드 디스크 파일에 대한 중요 정보를 제공하려면

  1. D3DXCreatePRTEngine 호출을 수정하여 메시에서 텍스처 좌표를 추출합니다(ExtractUV는 TRUE여야 합니다).
  2. 동일한 텍스처 크기를 사용하여 D3DXCreatePRTBuffer 호출을 D3DXCreatePRTBufferTex 로 바꿉니다.

ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSSS 및 ComputeDirectLightingSHAdaptive를 제외한 모든 ID3DXPRTEngine 메서드는 텍셀별 시뮬레이션에서 작동합니다. 텍스처 공간 시뮬레이션은 올바른 결과를 생성하지만 전송 벡터를 고밀도로 계산할 가능성이 높기 때문에 상당히 느릴 수 있습니다.

또 다른 방법은 꼭짓점당 적응형 PRT 시뮬레이션(텍셀당 데이터에 사용되는 텍스처 좌표 사용)을 계산한 다음 ID3DXPRTEngine::ResampleBuffer 를 호출하는 것입니다(적절한 해상도에서 D3DXCreatePRTBufferTex 를 사용하여 만든 출력 버퍼 사용). 이는 SDK의 모든 D3DX PRT 기능에서 작동하며 텍셀당 전송 버퍼를 직접 계산하는 것보다 훨씬 더 효율적일 수 있습니다.

런타임 계산

단일 클러스터를 사용하는 경우 다른 텍스처와 같이 결과를 필터링하고 밉 매핑할 수 있으며 픽셀 셰이더는 PRTDemo와 함께 제공되는 꼭짓점 셰이더 코드와 동일합니다.

압축에서 여러 클러스터를 생성하는 경우 클러스터링 인덱스가 연속되지 않으므로 데이터를 필터링하거나 밉맵할 수 없습니다. 다중 클러스터 데이터를 처리하기 위한 몇 가지 대안은 다음과 같습니다.

  • 픽셀 셰이더에서 모든 필터링을 직접 수행합니다. 아쉽게도 일반적으로 성능상의 이유로 비실용적입니다.
  • 텍스처가 낮은 해상도의 밉 매핑되지 않은 텍스처(예: 라이트 맵)인 경우 필터링이 발생하지 않는 텍스처 공간에서 직접 조명을 계산하고 음영 처리된 텍스처로 개체를 렌더링하는 것이 더 효율적일 수 있습니다. 기본적으로 GPU에서 완전히 생성된 동적 조명 맵입니다.
  • 텍스처 아틀라스를 사용하는 경우( UVAtlas 사용(Direct3D 9 참조) 텍스처 공간의 연결된 구성 요소에 있는 모든 전송 벡터가 동일한 클러스터에 있어야 하여 장면을 수동으로 클러스터링할 수 있습니다. 이렇게 하면 액세스하는 모든 텍셀이 생성에 의해 동일한 클러스터에 있기 때문에 텍스처를 필터링할 수 있습니다. 지정된 얼굴의 클러스터 ID가 꼭짓점 셰이더에서 전파될 수 있습니다.

픽셀 셰이더는 인덱싱할 수 없는 상수 레지스터가 훨씬 적으므로 픽셀 셰이더는 꼭짓점 셰이더와 다소 다릅니다. 클러스터당 작업을 저해상도 동적 텍스처에 저장하고 텍스처 로드를 사용하는 것이 여러 클러스터를 사용할 때 렌더링하는 가장 효율적인 방법입니다.

사전 계산된 Radiance 전송

PRT 데모 샘플

PRT 시뮬레이터(prtcmdline.exe)