Computer Graphics

OpenGL 광원 조명 질감 설정

익플루 2014. 1. 14. 17:52
반응형

OpenGL을 공부하면서

3D공간에서 광원과 조명의 중요성을 매일 발견하고 있다.

광원에 대해서 알아봅시다

 

광원

openGL의 조명( 사실 질감을 표현하기 위한 조명입니다 )

1. 주변광(ambient light) : 특정방향으 가지지 않는 빛.

 주변광은 특정한 방향이 없이 주변을 덮고 있는 빛을 말한다. 광원은 있지만 여러가지 요소들에 의해 부딪히고 반사되어 점차 방향을 잃어버린 빛의 형태에 해당한다.

그렇기 때문에 이러한 조명은 물체의 어떤면에나 비추어지며 물체가 어느쪽으로 회전하던간에 일정한 밝기와 색상으로 표현된다. 이 값을 크게 하면 밝게 보이게 된다. 하지만 너무 크게 값을 설정하면 밋밋하게 보이게 되어 입체감이 사라딘다.

 

2. 분산광(diffuse light) : 특정 방향으로 빛이 들어오고 모든방향으로 균일하게 반사.

  분산광이란 일정한 방향으로 빛이 들어와서 물체의 표면에서 여러 방향으로 분산되는 빛의 형태를 말한다. 분산되지만 이러한 빛을 받는 표면은 그렇지 않은 부분에 비해 밝게 보이게 된다.

예를 들면 형광등 불빛이 있다. 폴리곤의 방향이나 광원으로 부터의 거리에 따라서 밝기가 변한다.

 

3. 반사광(specular light) : 특정방향으로 빛이 들어오고 특정방향으로 반사.

 거울면 반사처럼 반질반질한 느낌을 표현하기 위한 것으로 이 값을 크게 하면 광원이 비춰지는 느낌이 되어, 폴리곤 표면이 금속광채가 있는것처럼 보이게 된다.

예를 들면 스포트라이트가 있다. 태양빛의 반사광.

 

4. 방사광(emissive light) : 객체 자체가 광우너처럼 빛을 내는 빛.(객체에는 영향을 미치지 않는다)

   이 값을 0이상으로 설정하면 스스로 발광하여 광원이 없어도 물체가 보인다. 단, 보이는것은 그 물체 자신만 해당되며 주변의  물체가 이 값에 의해서 영향을 받지는 않는다.

 

- 이외의 질감표현하는 방법

*Shininess(선명도)

  이 값이 크면 광원에 비추어지는 강도가 날카롭게 되어, 표면이 보다 매끈매끈하게 보인다.

 

다음으로 조명 사용법이다.

 

모든 객체의 모든 점들에 대해 법선들을 계산한다

-> 계산된 법선들은 광원에 대한 객체의 상대적인 방향을 결정한다

->모든 광원들을 생성하고 선택한 후 배치한다.

-> 조명 모델을 선택한다.

-> 장명 안의 객체들에 대한 재질의 속성을 정의한다.

 

ex.

 glEnable(GL_LIGHTING);                                        //조명 활성화
 glEnable(GL_LIGHT0);                                           //조명 ON
   
 float AmbientColor[]    = { 0.0f, 0.0f, 0.2f, 0.0f };         //주변광
 float DiffuseColor[]    = { 0.5f, 0.5f, 0.5f, 0.0f };          //분산광
 float SpecularColor[]   = { 0.5f, 0.5f, 0.5f, 0.0f };        //방사광
 float Position[]        = { 100.0f, 100.0f, 400.0f, 1.0f };  //조명 위치

 

//조명 설정 함수

  void Initialize()
{
   glClearCOlor( 0.0f, 0.0f, 0.0f, 0.0f );
                 // 검은색으로 화면 지움
   glShadeModel( GL_SMOOTH );
                              // 매끄러운 세이딩 사용
   
glEnable( GL_DEPTH_TEST );
                              // 가려진 면 제거
  
glEnable( GL_CULL_FACE );
                               // 후면 제거
  
glFrontFace( GL_CCW );
                                  // 다각형을 반시계방향으로 감는다.

   glEnable( GL_LIGHTING );
                                // 조명 활성화
  
   // LIGHT0 에 대한 재질을 설정
   glMaterialfv( GL_FRONT, GL_AMBIENT, matAmbient );       
   glMaterialfv( GL_FRONT, GL_DIFFUSE, matDiff );

   // LIGHT0 설정
  
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight );
       // 주변광 성분 설정
  
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight );
       // 분산광 성분 설정
  
glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );
     // 광원 위치 설정

   // LIGHT0을 켠다.
  
glEnable( GL_LIGHT0 );

}

 

여기서 광원 설정에 대한 함수는

glLightfv(  GLenum light( 광원 ), GLenum pname( 속성이름 ), TYPE *param( 속성 ) ); 

pname 인자들 

GL_AMBIENT 주변광의 세기
GL_DIFFUSE 분산광의 세기
GL_SPECULAR 반사광의 세기
GL_POSITION  광원위치지정
GL_SPOT_DIRECTION  스포트라이트 방향지정 벡터
GL_SPOT_EXPONENT 스포트라이트 지수
GL_SPOT_CUTOFF  스포트라이트 절단 각도
GL_CONSTANT_ATTENUATION  불변 감쇠값
GL_LINEAR_ATTENUATION  선형 감쇠값
GL_QUADRATIC_ATTENUATION 2차 감쇠값

 






 

 

 

 

 

 

 
 

그리고 조명 설정에 대한 함수는

glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)

     OpenGL의 폴리곤에는 겉과 내면(앞과 뒤)이라는 개념이 존재하는데, face는 둘중에 한쪽면의 질감을 설정할것인가를 지정.

     GL_FRONT(겉), GL_BACK(내면), GL_FORNT_AND_BACK(양면)중에 하나를 사용.

     pname은 질감의 어느 파라메타를 설정할것인가를 지정합니다. GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMMISSION, GL_SHININESS등이 있으며 이중에 하나를 선택해서 설정.

     params에는 RGBA형식으로 입력된 배열을 넘겨준다. 각각 -1부터 1의 범위내의 값을 넣는다. GL_SHININESS에의 경우에는 넘겨주는 값은 한개로, 0부터 128까지의 범위의 값이 된다. GL_SHINESS만 설정한다면 glMaterialf()함수를 써도 된다.

 

스포트라이트를 설정하기 위해선

 

float spotlightDirection[] = { 0.0f, 0.0f, -1.0f };              // 스포트라이트 방향
    
glLightf( GL_LIGHT1, GL_SPOT_CUTOFF , 80.0f );
                  // 80도 원뿔
    
glLightf( GL_LIGHT1, GL_SPOT_EXPONENT, 80.0f );
                 // 초점 설정
    
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spotlightPosition );   // 방향 설정

 

 

 

 

 

 

 

반응형

'Computer Graphics' 카테고리의 다른 글

OpenCL이란  (0) 2014.01.22
CUDA란 CUDA 병렬 프로그래밍 CUDA 병렬 처리  (0) 2014.01.16
컴퓨터 그래픽스 GPU GPGPU  (0) 2014.01.15
쉐이딩(Shading) 셰이딩  (0) 2014.01.10
쉐이더(Shader) 셰이더  (0) 2014.01.10