반사 조명(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);
수식에 따라 재질 색과 조명 색을 합친 색이 개체 꼭짓점의 색이 됩니다.
다음 두 그림에서는 반사 재질 색이 회색이고 반사 조명 색이 흰색입니다.
흰색
결과 반사 하이라이트는 다음 그림에 나와 있습니다.
반사 하이라이트를 주변 및 확산 조명과 결합하면 다음 그림이 만들어집니다. 세 가지 유형의 조명이 모두 적용되어 보다 명확하게 실제 개체를 모사합니다.
반사 조명은 확산 조명보다 계산이 더 많이 필요합니다. 일반적으로 표면 재질에 대한 시각적 단서를 제공하는 데 사용합니다. 반사 하이라이트는 표면 재질에 따라 크기와 색이 다릅니다.
관련 항목