다음을 통해 공유


반사 조명(Direct3D 9)

반사 반사를 모델링하려면 시스템이 조명이 이동하는 방향뿐만 아니라 뷰어의 눈에 대한 방향도 알아야 합니다. 시스템은 Phong 반사 리플렉션 모델을 단순화한 버전을 사용합니다. 이 버전은 중간 벡터를 사용하여 반사 리플렉션의 강도를 근사값으로 계산합니다.

기본 조명 상태는 반사 하이라이트를 계산하지 않습니다. 반사 조명을 사용하도록 설정하려면 D3DRS_SPECULARENABLE TRUE로 설정해야 합니다.

반사 조명 수식

반사 조명은 다음 수식으로 설명합니다.

반사 조명 = Cs * sum[Ls * (N · H)P * Atten * Spot]

 

다음 표에서는 변수, 해당 형식 및 해당 범위를 식별합니다.

매개 변수 기본값 Type 설명
Cₛ (0,0,0,0) D3DCOLORVALUE 반사 색.
sum 해당 없음 해당 없음 각 빛의 반사 구성 요소 합계.
N 해당 없음 D3DVECTOR 꼭지점 법선.
H 해당 없음 D3DVECTOR 벡터의 절반. 중간 벡터에 대한 섹션을 참조하세요.
P 0.0 FLOAT 반사 리플렉션 강도. 범위는 0부터 무한대입니다.
Lₛ (0,0,0,0) D3DCOLORVALUE 조명 반사 색.
Atten 해당 없음 FLOAT 조명 감쇠 값. 감쇠 및 스포트라이트 요소(Direct3D 9)를 참조하세요.
스폿 해당 없음 FLOAT 스포트라이트 계수. 감쇠 및 스포트라이트 요소(Direct3D 9)를 참조하세요.

 

Cₐ의 값은 다음 중 하나입니다.

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • 꼭짓점 color1- 반사 재질 원본이 D3DMCS_COLOR1 첫 번째 꼭짓점 색이 꼭짓점 선언에 제공된 경우입니다.
  • 꼭짓점 color2( 반사 재질 원본이 D3DMCS_COLOR2 경우 두 번째 꼭짓점 색이 꼭짓점 선언에 제공됩니다.
  • 재질 반사 색

참고

반사 재질 소스 옵션을 사용하고 꼭짓점 색이 제공되지 않으면 재질 반사 색이 사용됩니다.

 

반사 구성 요소는 모든 조명이 처리되고 별도로 보간된 후 0~255로 고정됩니다.

중간 벡터

중간 벡터(H)는 개체 꼭짓점에서 광원까지의 벡터 및 개체 꼭짓점에서 카메라 위치까지의 벡터 사이에 존재합니다. Direct3D는 중간 벡터를 컴퓨팅하는 두 가지 방법을 제공합니다. D3DRS_LOCALVIEWER TRUE로 설정되면 시스템은 조명의 방향 벡터와 함께 카메라의 위치와 꼭짓점의 위치를 사용하여 중간 벡터를 계산합니다. 다음 수식이 이것을 보여 줍니다.

H = norm(norm(Cp - Vp) + Ldir)

 

매개 변수 기본값 Type 설명
Cₚ 해당 없음 D3DVECTOR 카메라 위치.
Vₚ 해당 없음 D3DVECTOR 꼭짓점 위치.
Ldir 해당 없음 D3DVECTOR 꼭짓점 위치에서 조명 위치까지의 방향 벡터.

 

이러한 방식으로 중간 벡터를 결정하면 많은 계산이 필요할 수 있습니다. 또는 D3DRS_LOCALVIEWER = FALSE 를 설정하면 z축에서 뷰포인트가 무한히 먼 것처럼 작동하도록 시스템에 지시합니다. 이 방식은 다음 수식에 반영되어 있습니다.

H = norm((0,0,1) + Ldir)

 

이 설정은 계산이 덜 필요하지만 훨씬 덜 정확하므로 직교 투영을 사용하는 앱에서 사용하는 것이 좋습니다.

예제

이 예제에서는 장면 반사 광원 색과 재질 반사 색이 개체에 지정됩니다. 코드는 다음과 같습니다.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

수식에 따라 재질 색과 조명 색을 합친 색이 개체 꼭짓점의 색이 됩니다.

다음 두 그림에서는 반사 재질 색이 회색이고 반사 조명 색이 흰색입니다.

흰색 구의 회색 구그림 그림

결과 반사 하이라이트는 다음 그림에 나와 있습니다.

반사 강조 표시 그림

반사 하이라이트를 주변 및 확산 조명과 결합하면 다음 그림이 만들어집니다. 세 가지 유형의 조명이 모두 적용되어 보다 명확하게 실제 개체를 모사합니다.

반사 하이라이트, 주변 조명 및 확산 조명을 결합하는 그림

반사 조명은 확산 조명보다 계산이 더 많이 필요합니다. 일반적으로 표면 재질에 대한 시각적 단서를 제공하는 데 사용합니다. 반사 하이라이트는 표면 재질에 따라 크기와 색이 다릅니다.

조명의 수학