다음을 통해 공유


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

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

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

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

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

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

표준 확산 조명과 PRT 비교

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

기존 조명 모델

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

prt

인터리플렉션이 있는 PRT

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

다음 그림은 직접 PRT만 사용하여 만들어집니다(0개는 상호 변조 없이 반송됨).

직접 prt만 사용하여 렌더링된 일러스트레이션의 스크린샷을

다음 그림에서는 PRT와 인터플렉션을 사용하여 만듭니다(2개의 반사와 상호 변곡점이 있는 바운스).

인터플렉션과 prt를 사용하여 렌더링된 일러스트레이션의 스크린샷

하위 표면 분산을 사용하는 PRT

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

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

프렛을 사용하여 렌더링된 그림의 스크린샷과 하위 표면 분산

PRT 작동 방식

다음 용어는 다음 다이어그램에 설명된 대로 PRT의 작동 방식을 이해하는 데 유용합니다.

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

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

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

prt 작동 방식에 대한 다이어그램

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

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

prt 데이터 흐름다이어그램

PRT API를 사용하는 방법

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

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

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

    prt 렌더링수식

    어디:

    매개 변수 묘사
    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)

텍스처(Direct3D 9) 사용하여 PRT를 나타냅니다.

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

사전 계산된 Radiance Transfer Functions

수학 함수