반사 조명(Direct3D 9)
반사 반사를 모델링하려면 시스템이 조명이 이동하는 방향뿐만 아니라 뷰어의 눈에 대한 방향도 알아야 합니다. 이 시스템은 중간 벡터를 사용하여 반사광의 강도를 근사화하는 퐁 반사 모델의 간소화된 버전을 사용합니다.
기본 조명 상태는 반사 강조 표시를 계산하지 않습니다. 반사 조명을 사용하려면 D3DRS_SPECULARENABLE을 TRUE로 설정해야 합니다.
반사 조명 수식
반사 조명은 다음 수식에 설명되어 있습니다.
반사 조명 = Cs * sum[Ls * (N · H)P * Atten * Spot]
다음 표에서는 변수, 해당 형식 및 해당 범위를 식별합니다.
매개 변수 | 기본값 | 타입 | 설명 |
---|---|---|---|
Cs | (0,0,0,0) | D3DCOLORVALUE | 반사 색입니다. |
합계 | 해당 없음 | 해당 없음 | 각 광원의 반사 구성 요소의 합계입니다. |
N | 해당 없음 | D3DVECTOR | 꼭짓점 법선입니다. |
H | 해당 없음 | D3DVECTOR | 중간 벡터입니다. 중간 벡터의 섹션을 참조하세요. |
P | 0.0 | 뜨다 | 반사 성능. 범위는 0에서 +무한대입니다. |
Ls | (0,0,0,0) | D3DCOLORVALUE | 밝은 반사 색입니다. |
어텐 | 해당 없음 | 뜨다 | 조명 감쇠 값입니다. 감쇠 및 스포트라이트 계수(Direct3D 9)참조하세요. |
점 | 해당 없음 | 뜨다 | 스포트라이트 요소 감쇠 및 스포트라이트 요소(Direct3D 9)참조하세요. |
Cs의 값은 다음과 같습니다.
if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
C = color1;
- 꼭짓점 색상1은 반사 재질 소스가 D3DMCS_COLOR1인 경우, 꼭짓점 선언에서 첫 번째 꼭짓점 색상으로 제공됩니다.
- 꼭짓점 색2. 스펙큘러 재질 소스가 D3DMCS_COLOR2인 경우, 두 번째 꼭짓점 색이 꼭짓점 선언에 제공됩니다.
- 재질의 반사광 색상
메모
반사 재질 소스 옵션 중 하나를 사용하지만 정점 색이 제공되지 않으면, 재질의 반사 색이 사용됩니다.
반사 구성 요소는 모든 조명이 별도로 처리 및 보간된 후 0에서 255로 고정됩니다.
중간 벡터
중간 벡터(H)는 개체 꼭짓점에서 광원으로의 벡터와 개체 꼭짓점에서 카메라 위치로의 벡터라는 두 벡터 사이에 중간에 존재합니다. Direct3D는 중간 벡터를 계산하는 두 가지 방법을 제공합니다. D3DRS_LOCALVIEWER를 TRUE로 설정하면, 시스템은 카메라의 위치와 꼭짓점의 위치, 그리고 조명의 방향 벡터를 이용하여 중간 벡터를 계산합니다. 다음 수식은 이를 보여 줍니다.
H = norm(norm(Cp - Vp) + Ldir)
매개 변수 | 기본값 | 유형 | 설명 |
---|---|---|---|
Cp | 해당 없음 | 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);
수식에 따르면 개체 꼭짓점의 결과 색은 재질 색과 밝은 색의 조합입니다.
다음 두 그림에서는 회색인 반사 재질 색과 흰색인 반사 밝은 색을 보여 줍니다.
결과 반사 강조 표시는 다음 그림에 나와 있습니다.
그림
반사 하이라이트를 주변 조명 및 확산 조명과 결합하면 다음 그림이 생성됩니다. 세 가지 유형의 조명을 모두 적용하면 실제 개체와 더 명확하게 비슷합니다.
반사 조명은 확산 조명보다 계산에 더 집약적입니다. 일반적으로 표면 재질에 대한 시각적 단서를 제공하는 데 사용됩니다. 반사 강조 표시는 표면의 재질에 따라 크기와 색이 달라집니다.
관련 항목