다음을 통해 공유


반사 조명(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);

수식에 따르면 개체 꼭짓점의 결과 색은 재질 색과 밝은 색의 조합입니다.

다음 두 그림에서는 회색인 반사 재질 색과 흰색인 반사 밝은 색을 보여 줍니다.

회색 구 그림 흰색 구 그림

결과 반사 강조 표시는 다음 그림에 나와 있습니다.

반사 강조 표시 그림

반사 하이라이트를 주변 조명 및 확산 조명과 결합하면 다음 그림이 생성됩니다. 세 가지 유형의 조명을 모두 적용하면 실제 개체와 더 명확하게 비슷합니다.

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

반사 조명은 확산 조명보다 계산에 더 집약적입니다. 일반적으로 표면 재질에 대한 시각적 단서를 제공하는 데 사용됩니다. 반사 강조 표시는 표면의 재질에 따라 크기와 색이 달라집니다.

조명의 수학