5장 조명
조명 : 장면의 사실감을 더하기 위해 사용되며, 입체의 형테와 물체의 부피를 표현하는 데도 도움을 준다. 조명을 이용하면 더 이상 우리가 버텍스 컬러를 지정하지 않고도 정의된 조명과 재일, 그리고 표면의 각도에 따라 Direct3D 자체 조명 엔진을 통해 버텍스의 컬러가 계산되며, 조명 모델에 따라 계산된 버텍스의 컬러는 훨씬 자연스러운 장면을 연출한다.
5.1 조명의 요소
Direct3D의 조명 모델에서 광원이 만들어내는 빛은 다음과 같은 세 가지의 요소로 구성되어 있다.
*환경광 - 환경광은 다른 표면에 반사되어 전반적인 장면을 밝게 하는 빛을 모델링한다. 예를 들어, 물체의 일부분은 광원의 직접적인 시야에서 가려져 있더라도 약간의 빛을 받는다. 이런 부분은 다른 표면에서 반사된 빛을 받는 것이다.환경광은 이와 같이 반사된 빛을 비교적 저렴하고 간단하게 구현하는 방법이다.
*난반사광 - 난반사광은 특정한 방향으로 진행하며, 표면에 닿으면 모든 방향으로 동일하게 반사된다. 모든 방향으로 동일하게 반사되므로 위치와는 관계없이 관찰자의 눈에 빛이 도달하고 관찰자의 위치를 고려할 필요가 없다. 즉, 난반사광의 방정식에는 빛의 방향과 표면의 형태만을 고려하면 된다. 난반사광은 광원에서 발산되는 가장 일반적인 빛이다.
*정반사광 - 정반사광은 특정한 방향으로 진행하며, 표면에 닿으면 한 방향으로 강하게 반사하여 특정한 각도에서만 관찰할 수 있다. 한 방향으로만 빛을 반사하기 때문에 정반사광의 방정식에는 빛의 방향과 표면의 형태, 그리고 관찰자의 시점을 모두 고려해야 한다. 정반사광은 반짝이는 표면에 빛이 반사하는 효과를 모델링하는 데 이용된다.
정반사광은 다른 타입의 빛에 비해 좀더 많은 계산을 필요로 하기 때문에 Direct3D는 이를 끌 수 있는 옵션을 제공한다. 실제로 이 옵션은 디폴트로 꺼져 있으며, 정반사광을 활성화하기 위해서는 D3DRS_SPECULARENABLE 렌더 상태를 설정해야 한다.
Device-> SetRenderState(D3DRS_SPECULARENABLE, true)
각각이ㅡ 빛의 형은 빛의 컬러를 표현하는 D3DCOLOR나 D3DCOLORVALUE 구조체로 나타낼 수 있다.D3DXCOLOR 클래스의 알파값은 빛의 컬러를 표현할 때는 이용되지 않는다.
5.2 재질
우리가 현실에서 보는 물체의 컬러는 물체가 반사하는 빛의 컬러에 의해 결정된다.
D3D는 물체의 재질을 정의할 수 있도록 하여 이와 같은 현상을 모델링하는데, 재질은 물체의 표면에서 반사할 빛의 퍼센테이지를 지정할 수 있도록 해준다.코드에서는 다음과 같은 D3DMATERIAL9 구조체로 재질을 나타낸다.
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse, Ambient, Specular, Emissive;
float Power;
}D3DMATERIAL9
Diffuse - 표면이 반사하는 난반사광의 양을 지정한다.
Ambient - 표면이 반사하는 환경관의 양을 지정한다.
Specular - 표면이 반사하는 정반사광의 양을 지정한다.
Emissive - 이 성분은 전반적인 표면의 컬러를 더하는 데 사용되며, 물체 자체가 빛을 발하는 것처럼 좀더 밝은 물체 효과를 만들어낸다.
Power - 정반사광의 날카로운 정도를 지정하며, 값이 높아질수록 하이라이트가 강조된다.
예를 들어 빨간 공을 원한다고 가정해보자, 예에서는 빨간빛만을 반사하고 다른 모든 빛을 흡수하도록 재질을 설정하면 된다.
각각의 빛의 타입에 따라 반사될 빛의 컬러를 지정할 수있다.
모든 빛 흡수 - 검은색
모든 빛 반사 - 흰색
D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)
함수를 통해 초기화를 대신할수도 있음
버텍스 구조체는 재질 속성을 가지지 않으며,대신 현재의 재질을 지정하는 IDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9* pMaterial) 메서드를 이용한다.
예를 들어, 서로 다른 재질을 이용하는 몇 개의 물체를 렌더링하고자 한다면 다음과 같은 코드 구조를 이용하면 된다.
D3DMATERIAL blueMaterial, redMaterial;
...//재질 구조체 구성
Device->SetMaterial(&blueMaterial);
drawSphere();
Device->SetMaterial(&redMaterial);
drawSphere();
5.3 버텍스 법선
면 법선은 다각형이 바라보는 방향을 표시하는 벡터이다.
버텍스 법선 : 기본적으로 동일한 아이디어에 기반을 두고 있지만 각각의 폴리곤에 따른 법선이 아니라 폴리곤을 구성하는 베거에 대한 법선을 정의한다.
D3D는 빛의 각도를 버텍스 단위로 계산하므로 버텍스 각도(법선)을 필요로한다.
버텍스 법선과 면 법선이 동일한 것은 아니라는 데 주의하자.
버텍스의 버텍스 법선을 표기하기 위해서는 버텍스 구조체를 갱신해야한다.
struct Vertex
{
float _x,_y, _z;
flaot _nx,_ny,_nz;
static const DWORD FVF;
}
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;
컬러멤버 제거 -> 버텍스 컬러를 계산하는데 조명을 이용
다음 함수는 삼각형의 세 버텍스 포인트에서 면벡터를 계산. 이함수는 버텍스가 시계 방향 두르기 순서를 이용하고 있다고 가정. 아니라면 법선이 반대방향
void ComputeNormal(D3DXVECTOR3 p0,D3DXVECTOR3 p1,D3DXVECTOR3 p2,D3DXVECTOR3 out)
{
D3DXVECTOR3 u = p1 - p0;
D3DXVECTOR3 v = p2 - p0;
d3dvec3cross(out,&u,&v);
d3dvec3Normalize(out,out);
}
면법선을 버텍스 법선으로 이용하면 그다지 부드럽지 않다 -> 법선 평균을 수행.
버텍스 법선을 찾기위해서는 우선 버텍스 v를 공유하는 메쉬 내 모든 삼각형의 면 법선을 찾은 다음, 모든 면 법선의 평균을 구한다.
변화 단계에서 버텍스 법선이 왜곡되는 현상이 발생할 수 있으므로, D3DRS_NORMALIZENORMALS 렌더 상태를 활성화하여 변화 단계 이후에 Direct3D가 모든 법선을 다시 정리하도록 하는 것이 안전하다.
Device->SetRenderState(D3DRS_NORMALIZENORMALS,true);
5.4 광원
D3D는 세 가지 타입의 광원을 지원한다.
*점 관원 - 점 광원은 월드 스페이스 내에 위치를 가지며 모든 방향으로 빛을 발산한다.
*방향성 광원 - 방향성 광원은 위치는 가지지 않지만 지정된 방향으로 평행하게 빛을 발산한다.
D3DLIGHT9 인스턴스를 초기화한 다음에는 D3D가 관리하는 내부 리스트에 이를 등록해야 한다.
Device->SetLight(
0 // 지정할 광원 리스트 내의 요소, 범위는 0 -최대 광원
&light // 설정하려는 D3DLIGHT 구조체의 주소
);
광원을 등록한 다음에는 다음과 같은 코드로 광원을 켜거나 끌 수있다.
Device->LightEnable(
0, // 활/비활성화 하려는 광원 리스트 내의 요소
true // 트루는 활성화
);
요약
*D3D는 방향성,점,스포트 광원을 제공하며 광원은 환경광과 난반사광,정반사광의 세 가지 빛을 발산한다.
*표면의 재질은 표면과 표면에 닿는 빛과의 상호작용을 정의한다.
(반사되거나 흡수될 빛의 양을 조정하여 표면의 컬러를 결정한다.)
*버텍스 법선은 버텍스의 방향을 정의하며 D3D는 버텍스 법선을 이용해 버텍스에 빛이 닿는 각도를 계산해낸다.
Determined to excel, Ethan spent weeks honing his poker skills and studying various strategies. On the day of the tournament, he approached the game with a mix of nerves and confidence. His preparation paid off as he navigated through https://bdmbet-casino-france.com/ challenging hands and outplayed many seasoned opponents. By applying his strategic insights and remaining calm under pressure, Ethan advanced to the final table. Against the odds, he clinched the championship and the top prize, transforming from an enthusiastic novice into a celebrated poker champion. Ethan's journey underscores the power of preparation and perseverance in achieving success.