재질과 광원에 대해서 알아본다.

재질과 광원의 차이에 대해서 이해하고 넘어가자!!!!!!!!!



<재질>
1.재질이란 ? 

  메시의 표면 상태를 말하는 것으로 빛이 물체의 표면에서 반사되어 변화된 뒤 사람의 눈에 들어오기까지의 과정을 수학적으로 모델링하기 위해서 사용하는 값들이다.

 

2. 재질값을 이루는 구성요소

1. 주변광(ambient) : 최저 평균 밝기를 말한다. 똑같은 양으로 모든 면에서 나오는 빛

2. 확산광(diffuse) :   표면의 모든 점들에 균일하게 비춰지는 빛

3. 반사광(specular) : 특정한 방향으로만 반사하는 빛. 광원의 위치와 카메라의 위치에 따라서 달라진다.

4. 방출광(emissive) : 메시 표면에서 자체적으로 방출되는 빛. 이 빛이 다른 메시에 영향을 주지는 못한다.

3. 재질을 쓰는 이유?
빛을 모두 표현하기에는 컴퓨터로 불가능해서 D3D나 오픈GL같은 3차원 그래픽 API에서 간략화된 계산식을 사용하는데 그에 필요한 빛들을 말함. 
 
 



<광원의 종류>

 

1.주변 광원(ambient light) 
 3차원 공간 내에서 메시의 배치나 위치와는 전혀 상관없이 똑같은 양으로 모든곳을 비추는 빛의 강도를 말한다. 방향과 위치가 없으며, 색깔과 강도만이 존재한다.

앰비언트 라이트는, 장면(scene)에 균일한 조명을 가져온다. 앰비언트 라이트는, 정점 법선, 라이트의 방향, 라이트의 위치 좌표, 범위, 감쇠등의 조명 요인으로 의존하지 않기 때문에, 개체의 모든 정점을과 같이 비춘다. 최고 속도의 조명이지만, 얻을 수 있는 결과의 리얼리티는 가장 낮다. Microsoft® Direct3D® 에는, 라이트를 생성 하지 않아도 사용할 수 있는글로벌 앰비언트 라이트 속성이 1 개만 있다. 대신에, 라이트 개체의 설정에 의해 앰비언트 라이트를 실현할 수도 있다. 장면(scene)의 앰비언트 라이트는, 다음의 방정식으로 나타낸다.

이 예에서는, 장면(scene)의 앰비언트 라이트 및 머트리얼의 앰비언트 라이트를 사용해 개체에 첨가하고 있다. 코드를 다음에 나타낸다.

 

#define GRAY_COLOR 0x00bfbfbf

// create material
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
mtrl.Ambient.r = 0.75f;
mtrl.Ambient.g = 0.0f;
mtrl.Ambient.b = 0.0f;
mtrl.Ambient.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, GRAY_COLOR);

 

방정식에 따르면 개체 정점의 색은, 머트리얼색과 조명색을 조합한 색이 된다.

이러한 2 개의 이미지가 가리키도록(듯이), 머트리얼의 색은 회색, 라이트의 색은 밝은 빨강이다.
 

                         

이 결과, 다음에 나타내는 것 같은 장면(scene)이 된다. 장면내의 유일한 개체는 구다. 앰비언트 라이트는, 개체의 모든 정점을 같은 색으로 비춘다. 정점 법선이나 라이트의 방향에는 의존하지 않는다. 결과적으로, 구체는 2D 의 엔과 같이 보인다. 이것은, 개체의 표면에 쉐이딩의 차이가 생기지 않기 때문이다.

개체를 보다 리얼하게 보이게 하려면 , 앰비언트 라이트에 가세해 디퓨즈 라이트나 스펙큐러 라이트를 적용한다.

                                       





 

라이트의 종류의 속성은, 사용하는 광원의 종류를 정의한다.
C++ 의 경우, 라이트의 종류는, 라이트의D3DLIGHT9 구조체의 Type 멤버에 D3DLIGHTTYPE 열거로부터의 값을 사용해 설정한다.  Microsoft® Direct3D® 에는, point, spotlight, Directional light의 3 종류의 라이트가 있다.
라이트의 종류 마다, 장면(scene)내의 개체의 비추는 방법이 달라, 계산에 있어서의 오버헤드의 레벨도 다르다

D3DLIGHT9 light;
light.Type = 타입이 들어감~
llight.Diffuse.r = 1.0f
llight.Diffuse.g = 1.0f
llight.Diffuse.b = 1.0f
pd3dDevice->SetLight( 0, &light );
pd3dDevice->LightEnale( 0 , TRUE );



2.포인트 라이트(Point Light)


포인트 라이트는, 장면(scene)내에서 색과 위치를 가지지만, 단일의 방향은 가지지 않는다.  
다음 그림이 나타내듯 포인트 라이트는 모든 방향으로 균등하게 빛을 낸다.


포인트 라이트의 예로서는 전구가 있다. 포인트 라이트는 감쇠와 범위의 영향을 받아 정점 단위로 메쉬를 비춘다. 조명의 실행중, Direct3D 는, 월드 공간에서의 포인트 라이트의 위치와 조명 하는 정점의 좌표를 사용해, 라이트의 방향을 나타내는 벡터와 빛이 진행된 거리를 얻어온다. 정점 법선에 가세해, 이 벡터와 거리의 양쪽 모두를 사용해, 표면에 어느 정도 빛이 맞는지를 계산한다.

D3DLIGHT9 light;
light.Type = D3DLIGHT_POINT;
llight.Diffuse.r = 1.0f
llight.Diffuse.g = 1.0f
llight.Diffuse.b = 1.0f
pd3dDevice->SetLight( 0, &light );
pd3dDevice->LightEnale( 0 , TRUE );



 

3.디렉셔널 라이트(Difectional Light)

디렉셔널 라이트는, 색과 방향을 가져, 위치는 가지지 않는다. 이것은 평행한 빛을 방사한다.
즉, 디렉셔널 라이트로 생성된 빛은 모두 장면(scene)내에서 같은 방향으로 나아간다. 디렉셔널 라이트는, 태양과 같이 멀게 멀어진 광원에 비유할 수가 있다. 디렉셔널 라이트는 감쇠와 범위의 영향을 받지 않기 때문에, Direct3D 에서는 지정된 색과 방향만 고려해, 정점의 색을 계산한다. 조명 계수의 개수가 적기 때문에, 디렉셔널 라이트는 컴퓨터에의 부하가 가장 가벼운 라이트이다.

D3DLIGHT9 light;
light.Type = D3DLIGHT_DIRECTIONAL;
llight.Diffuse.r = 1.0f
llight.Diffuse.g = 1.0f
llight.Diffuse.b = 1.0f
pd3dDevice->SetLight( 0, &light );
pd3dDevice->LightEnale( 0 , TRUE );



 

4.스팟라이트(Spot Light)
 

spotlight는, 색, 위치, 빛을 방사할 방향을 갖는다.

spotlight로부터 방사되는 빛은, 밝은 내부 콘과 이것보다 큰 외부 콘으로 구성된다. 다음 그림이 나타내듯 빛의 강도는 2 개의 콘간에 감소한다. 

D3DLIGHT9 light;
light.Type = D3DLIGHT_SPOT;
llight.Diffuse.r = 1.0f
llight.Diffuse.g = 1.0f
llight.Diffuse.b = 1.0f
pd3dDevice->SetLight( 0, &light );
pd3dDevice->LightEnale( 0 , TRUE );



spotlight는, 폴 오프, 감쇠, 및 범위의 영향을 받는다. 이러한 요인은, 빛이 각 정점까지 진행되는 거리와 같이, 장면(scene)내의 개체에의 조명 이펙트를 계산할 경우에 고려에 넣는다. 각 정점에 대한 이러한 이펙트를 계산하므로, Direct3D 의 모든 라이트중에서 계산에 가장 시간이 걸리는 것은 spotlight이다.


<심화학습>
 

C++ 의 D3DLIGHT9 구조체에는, spotlight에서만 사용하는 3 개의 멤버가 포함되어 있다.
이러한 멤버 (Falloff,Theta,Phi)는, spotlight 개체의 내부 콘과 외부 콘의 크기를 제어해, 양쪽 모두의 콘의 사이에 라이트가 어떻게 감소하는지를 제어한다.
=> 

Theta 값은 spotlight의 내부 콘의 라디안 각도를 나타내,Phi 값은 외부 콘의 라디안 각도를 나타낸다.Falloff 값은, 내부 콘의 외측 엣지와 외부 콘의 안쪽 엣지와의 사이로, 라이트의 강도가 어떻게 감소하는지를 제어한다. 대부분의 애플리케이션에서는,Falloff 를 1.0 으로 설정해 2 개의 콘간에 폴 오프가 한결같게 생기도록(듯이) 하지만, 필요에 따라서 이외의 값을 설정할 수도 있다.

다음 그림은 멤버의 값의 사이에 있는 관계와 이러한 값이 spotlight의 내부 콘과 외부 콘에게 주는 영향을 나타내고 있다.

 

 




5.에미션 라이트(Emission Light)
 

에미션(emission) 조명은 1 개의 항만으로 기술된다.

Emissive Lighting = Ce 

여기서

파라미터디폴트값설명
Ce (0,0,0,0) D3DCOLORVALUE 에미션(emission)색.


Ce 의 값은 다음중 하나이다.

  • 정점색 1 (EMISSIVEMATERIALSOURCE = D3DMCS_COLOR1 로, 정점의 선언으로 최초의 정점색을 지정했을 경우)
  • 정점색 2 (EMISSIVEMATERIALSOURCE = D3DMCS_COLOR2 로, 정점의 선언으로 2 번째의 정점색을 지정했을 경우)
  • 머트리얼의 에미션(emission)색
  몇개의 EMISSIVEMATERIALSOURCE 옵션이 사용되고 있어, 정점색이 지정되지 않은 경우는, 머트리얼의 에미션(emission)색을 사용한다.

이 예에서는, 장면(scene)의 앰비언트 라이트 및 머트리얼의 앰비언트 라이트를 사용해 개체에 첨가하고 있다. 코드를 다음에 나타낸다.

// create material
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
mtrl.Emissive.r = 0.0f;
mtrl.Emissive.g = 0.75f;
mtrl.Emissive.b = 0.0f;
mtrl.Emissive.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
방정식에 따르면 개체의 정점의 색은 머트리얼색이 된다. 

다음 화면은 초록의 머트리얼색을 나타내고 있다. 에미션(emission) 라이트는, 개체의 모든 정점을 같은 색으로 비춘다. 이 색은, 정점의 법선이나 라이트의 방향으로 의존하지 않는다. 결과적으로, 구체는 2D 의 엔과 같이 보인다. 이것은, 개체의 표면에 쉐이딩의 차이가 생기지 않기 때문이다.

이 화면은, 에미션(emission) 라이트가 전의 예로 가리킨 다른 3 종류의 라이트와 어떻게 블렌드 하는지를 나타내고 있다. 구체의 우측에서는, 초록의 에미션(emission) 라이트와 빨강의 앰비언트 라이트를 블렌드 하고 있다. 구체의 좌측에서는, 초록의 에미션(emission) 라이트가 빨강의 앰비언트 라이트 및 디퓨즈 라이트와 블렌드 해, 붉은 색이 조금씩 변화하고 있다. 스펙큐러 하이라이트는 중앙에서는 희고, 스펙큐러 라이트값이 급격하게 감소하는 장소에는 노란 고리가 되어 있다. 이 황색은, 앰비언트, 디퓨즈, 에미션(emission)의 라이트의 값을 블렌드 한 색이다.

 

 

 

여기서 중요한것은 이 광원 모델은 D3D의 고정함수 파이프라인(Fixed Function Pipeline)을 사용할 때만 유효하고,
HLSL이나 정점쉐이더, 픽셀쉐이더를 사용하게 되면 모두 무용지물이 됨!!!! 


[출처] 조명(Light) - 기초|작성자 누리블루

이 글을 공유하기

댓글

Designed by JB FACTORY