사전 계산된 방사형 전송(Direct3D 9)

사전 계산된 방사형 전송 사용

조명 환경이 모델링되는 방식(즉, 영역 조명 모델과 점/방향 모델) 및 모델링되는 전역 효과(예: 그림자, 반사 간, 지하 분산)를 포함하여 흥미로운 장면에는 여러 가지 복잡성이 있습니다. 기존의 대화형 렌더링 기술은 이러한 복잡성의 제한된 양을 모델링합니다. PRT를 사용하면 다음과 같은 몇 가지 중요한 제한 사항이 적용됩니다.

  • 개체는 경직된 것으로 간주됩니다(즉, 변형 없음).
  • 개체 중심 접근 방식입니다(개체를 함께 이동하지 않는 한 이러한 전역 효과는 개체 간에 유지되지 않음).
  • 저주파 조명만 모델링됩니다(그 결과 부드러운 그림자가 발생). 고주파 조명(날카로운 그림자)의 경우 기존 기술을 사용해야 합니다.

PRT에는 다음 중 하나가 필요하지만 둘 다 필요하지는 않습니다.

  • 고도로 테셀레이션된 모델 및 vs_1_1
  • ps_2_0

표준 확산 조명과 PRT 비교

다음 그림은 기존(n · l) 조명 모델을 사용하여 렌더링됩니다. 다른 패스와 일종의 그림자 기술(그림자 깊이 맵 또는 그림자 볼륨)을 사용하여 날카로운 그림자를 사용하도록 설정할 수 있습니다. 여러 조명을 추가하려면 여러 패스(그림자를 사용하는 경우) 또는 기존 기술을 사용하는 더 복잡한 셰이더가 필요합니다.

기존 조명 모델을 사용하여 렌더링된 그림의 스크린샷

다음 그림은 RESOLVE 수 있는 단일 방향 광원의 최적 근사치를 사용하여 PRT로 렌더링됩니다. 이로 인해 전통적인 기술로 생성하기 어려운 부드러운 그림자가 생성됩니다. PRT는 항상 여러 조명을 추가하거나 환경 맵을 사용하여 조명 환경을 완성하므로 셰이더에서 사용하는 상수의 값만 변경합니다.

prt를 사용하여 렌더링된 그림의 스크린샷

인터플렉션이 있는 PRT

직접 조명은 조명에서 직접 표면에 도달합니다. 인터플렉션은 다른 표면에서 몇 번 튀어나온 후 표면에 도달하는 빛입니다. PRT는 단순히 다른 매개 변수를 사용하여 시뮬레이터를 실행하여 런타임에 성능을 변경하지 않고 이 동작을 모델링할 수 있습니다.

다음 그림은 직접 PRT만 사용하여 만들어집니다(0개는 상호 굴절 없이 바운스됨).

직접 prt만 사용하여 렌더링된 그림의 스크린샷

다음 그림에서는 PRT를 사용하여 상호 변곡점(2개는 상호 변곡점이 있는 바운스)을 사용하여 만듭니다.

prt를 인터플렉션과 함께 사용하여 렌더링된 그림의 스크린샷

하위 표면 분산이 있는 PRT

지하 산란은 빛이 특정 재질을 통과하는 방법을 모델링하는 기술입니다. 예를 들어 손바닥에 조명이 켜진 손전등을 누릅니다. 손전등의 빛은 손을 통과하고, 주위를 튀기고(과정에서 색을 변경) 손의 반대편에서 빠져나갑니다. 시뮬레이터를 간단하게 변경하고 런타임을 변경하지 않고 모델링할 수도 있습니다.

다음 그림에서는 하위 표면 분산이 있는 PRT를 보여 줍니다.

표면 분산과 함께 prt를 사용하여 렌더링된 그림의 스크린샷

PRT 작동 방식

다음 용어는 다음 다이어그램과 같이 PRT의 작동 방식을 이해하는 데 유용합니다.

원본 래디언스: 원본 광채는 조명 환경 전체를 나타냅니다. PRT에서 임의의 환경은 구형 고조파를 사용하여 근사화됩니다. 이 조명은 개체(환경 맵으로 만든 것과 동일한 가정)에 상대적으로 먼 것으로 간주됩니다.

방사 광원: 출구 광채는 가능한 모든 소스(반사된 광채, 지하 산란, 방출)에서 표면의 지점에서 나가는 빛입니다.

전송 벡터: 전송 벡터는 원본 래디언스를 종료 광채로 매핑하고 복잡한 광 전송 시뮬레이션을 사용하여 오프라인으로 사전 계산됩니다.

prt 작동 방식 다이어그램

PRT는 다음 다이어그램과 같이 렌더링 프로세스를 두 단계로 구성합니다.

  1. 비용이 많이 드는 광원 전송 시뮬레이션은 런타임에 사용할 수 있는 전송 계수를 미리 계산합니다.
  2. 비교적 가벼운 런타임 스테이지는 먼저 구면 고조파를 사용하여 조명 환경을 근사화한 다음, 간단한 셰이더를 사용하여 이러한 조명 계수와 사전 계산된 전송 계수(1단계)를 사용하여 출구 광채(개체를 떠나는 빛)를 생성합니다.

prt 데이터 흐름 다이어그램

PRT API를 사용하는 방법

  1. 컴퓨팅 중 하나를 사용하여 전송 벡터 컴퓨팅... ID3DXPRTEngine의 메서드입니다.

    이러한 전송 벡터를 직접 처리하려면 상당한 양의 메모리 및 셰이더 계산이 필요합니다. 압축하면 필요한 메모리 및 셰이더 계산의 양이 크게 줄어듭니다.

    최종 조명 값은 다음 압축 렌더링 수식을 구현하는 꼭짓점 셰이더에서 계산됩니다.

    prt 렌더링 수식

    위치:

    매개 변수 Description
    Rp 꼭짓점 p의 단일 출구 방사 채널이며 메시의 모든 꼭짓점에서 평가됩니다.
    Mk 클러스터 k의 평균입니다. 계수의 Order² 벡터입니다.
    k 꼭짓점 p의 클러스터 ID입니다.
    L' SH 기저 함수에 대한 원본 발광의 근사치입니다. 계수의 Order² 벡터입니다.
    j PCA 벡터 수를 합산하는 정수입니다.
    wpj 포인트 p에 대한 jth PCA 가중치입니다. 단일 계수입니다.
    Bkj 클러스터 k에 대한 jth PCA 기본 벡터입니다. 계수의 Order² 벡터입니다.

     

    추출... ID3DXPRTCompBuffer 메서드는 시뮬레이션에서 압축된 데이터에 대한 액세스를 제공합니다.

  2. 원본 광채를 계산합니다.

    API에는 다양한 일반적인 조명 시나리오를 처리하는 몇 가지 도우미 함수가 있습니다.

    함수 용도
    D3DXSHEvalDirectionalLight 기존의 방향 광원을 근사화합니다.
    D3DXSHEvalSphericalLight 로컬 구형 광원의 근사치입니다. (PRT는 거리 조명 환경에서만 작동합니다.)
    D3DXSHEvalConeLight 먼 영역 광원을 근사화합니다. 예를 들어 태양(매우 작은 원뿔 각도)이 있습니다.
    D3DXSHEvalHemisphereLight 두 색(구의 각 극에 하나씩) 사이의 선형 보간인 조명을 평가합니다.

     

  3. 종료 광채를 계산합니다.

    이제 수식 1은 꼭짓점 또는 픽셀 셰이더를 사용하여 모든 지점에서 평가되어야 합니다. 셰이더를 평가하려면 상수를 미리 계산하고 상수 테이블에 로드해야 합니다(자세한 내용은 PRT 데모 샘플 참조). 셰이더 자체는 이 수식의 간단한 구현입니다.

    struct VS_OUTPUT
    {
        float4 Position   : POSITION;   // vertex position 
        float2 TextureUV  : TEXCOORD0;  // vertex texture coordinates 
        float4 Diffuse    : COLOR0;     // vertex diffuse color
    };
    
    VS_OUTPUT Output;   
    Output.Position = mul(vPos, mWorldViewProjection);
    
    float4 vExitR = float4(0,0,0,0);
    float4 vExitG = float4(0,0,0,0);
    float4 vExitB = float4(0,0,0,0);
    
    for (int i=0; i < (NUM_PCA_VECTORS/4); i++) 
    {
       vExitR += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*0];
       vExitG += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*1];
       vExitB += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*2];
    }
    
    float4 vExitRadiance = vClusteredPCA[iClusterOffset];
    vExitRadiance.r += dot(vExitR,1);
    vExitRadiance.g += dot(vExitG,1);
    vExitRadiance.b += dot(vExitB,1);
    
    Output.Diffuse = vExitRadiance;
    

참조

PRT 및 구형 고조파에 대한 자세한 내용은 다음 문서를 참조하세요.

Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, 
Low-Frequency Lighting Environments 
P.-P. Sloan, J. Kautz, J. Snyder
SIGGRAPH 2002 

Clustered Principal Components for Precomputed Radiance Transfer 
P.-P. Sloan, J. Hall, J. Hart, J. Snyder 
SIGGRAPH 2003 

Efficient Evaluation of Irradiance Environment Maps 
P.-P. Sloan 
ShaderX 2,  W. Engel 

Spherical Harmonic Lighting: The Gritty Details 
R. Green 
GDC 2003 

An Efficient Representation for Irradiance Environment Maps 
R. Ramamoorthi, P. Hanrahan 

A Practical Model for Subsurface Light Transport 
H. W. Jensen, S. R. Marschner, M. Levoy, and P. Hanrahan 
SIGGRAPH 2001 

Bi-Scale Radiance Transfer 
P.-P. Sloan, X. Liu, H.-Y. Shum, J. Snyder
SIGGRAPH 2003 

Fast, Arbitrary BRDF Shading for Low-Frequency Lighting Using Spherical 
Harmonics 
J. Kautz, P.-P. Sloan, J. Snyder
12th Eurographics Workshop on Rendering 

Precomputing Interactive Dynamic Deformable Scenes 
D. James, K. Fatahalian 
SIGGRAPH 2003 

All-Frequency Shadows Using Non-linear Wavelet Lighting Approximation 
R. Ng, R. Ramamoorth, P. Hanrahan 
SIGGRAPH 2003 

Matrix Radiance Transfer 
J. Lehtinen, J. Kautz
SIGGRAPH 2003 

Math World 
E. W. Weisstein, Wolfram Research, Inc. 

Quantum Theory of Angular Momentum 
D. A. Varshalovich, A.N. Moskalev, V.K. Khersonskii 

고급 항목

PRT 수식(Direct3D 9)

텍스처로 PRT 표현(Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

미리 계산된 방사형 전송 함수

수학 함수