광원

2022. 8. 15. 21:08Public/GraphicsAPI

재질의 종류

재질이란 메시(혹은 물체)의 표면 상태를 말하는 것으로 빛이 물체의 표면에서 반사되어 변화된 뒤 사람의 눈에 들어오기까지의 과정을 수학적으로 모델링하기 위해서 사용하는 값들이다. 복잡한 수식은 나중으로 미루고 이런 값들이 있다는 것을 알아두자.

  • 주변색(ambient) : 광원의 위치와 무관하게 똑같은 양으로 모든 점에서 반사되는 색
  • 확산색(diffuse) : 광원에 반사될 때 출력되는 가장 주된 색
  • 반사색(specular) : 특정한 방향으로만 반사되는 색, 광원의 위치와 카메라의 위치에 따라서 달라진다.
  • 방출색(emissive) : 메시 표면에서 자체적으로 방출되는 색. 단, 이 빛이 다른 메시에 영향을 주지는 못한다.

 

광원의 종류

실제로 빛이 물체 표면에서 반사되어 인간의 눈에 도달하기까지의 과정을 시물레이션하려면 엄청난 계산이 필요하다

따라서 D3D나 OpenGL 같은 대부분의 실시간 3차원 그래픽 API들은 간략화된 계산식을 사용한다. 계산식을 간략화하는 과정에서 실세계에는 없는 수학적인 모델링을 위한 광원들이 생겨나게 되었다. 대표적인 예가 주변광원으로 이러한 빛은 실세계에서는 존재할 수 없는 빛이다.

종류 기능 사용 예
주변광원(ambient light) 3차원 공간 내에서 메시의 배치나 위치와는 전혀 상관없이 똑같은 양으로 모든 곳을 비추는 빛의 강도를 말한다. 위치가 없으며 색과 강도만이 존재한다. pd3dDevice->SetRenderState(D3DRS_AMBIENT,0x00202020);
점광원(point light) 직관적으로 가장 쉽게 생각할 수 있는 빛이다. 예를 들면, 백열전구를 생각하면 된다. 광원의 위치에 따라 빛의 강도가 달라진다. D3DLIGHT9 light;
light.Type = D3DLIGHT_POINT;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
pd3dDevice->SetLight(0,&light);
pd3dDevice->LightEnable(0,TRUE);
방향성광원(directional light) 모든 광원의 방향이 하나의 방향을 갖는 것으로 완벽하지는 않지만 태양을 예로 들 수 있다. 광원의 위치는 상관없고 방향이 가장 중요한 요소다. D3DLIGHT9 light;
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
pd3dDevice->SetLihgt(0,&light);
pd3dDevice->LightEnable(0,TRUE);
점적광원(spot light) 정해진 위치와 범위에만 비추는 특수한 조명을 말한다. 흔히 영화나 쇼무대에서 사용하는 스포트라이트 조명을 생각하면 된다. D3DLIGHT9 light;
light.Type = D3DLIGHT_SPOT;
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
pd3dDevice->SetLight(0,&light);
pd3dDevice->LightEnable(0,TRUE);

이들 광원모델은 D3D의 고정함수 파이프라인(fixed function pipeline)을 사용할 때만 유효하고, 정점 셰이더와 픽셀 셰이더를 사용하게 되면 모두 무용지물이 된다. 오히려 수학적으로 광원연산이 어떻게 이루어지는가를 아는 것이 셰이더 프로그래밍에 효율적이다.

'Public > GraphicsAPI' 카테고리의 다른 글

Direct3D 초기화 예제  (0) 2022.09.25
DX11 Tutorial02 코드 설명  (0) 2022.08.22
행렬 01  (0) 2022.08.15
그리기 (Render)  (0) 2022.08.14
정점 버퍼  (0) 2022.08.14