[c++] OpenGL에서의 광원 및 조명

OpenGL은 실시간 3D 그래픽을 렌더링하기 위한 강력한 라이브러리로 널리 사용되고 있습니다. 3D 그래픽을 렌더링할 때 광원과 조명을 효과적으로 다루는 것은 그림의 형상을 더욱 현실적으로 만드는 데 중요합니다. 이 기술 블로그에서는 OpenGL에서 광원 및 조명을 다루는 방법에 대해 설명하겠습니다.

광원(illumination)의 종류

OpenGL에서는 세 가지 종류의 광원을 다룰 수 있습니다.

1. 환경 광원 (Ambient Light)

환경 광원은 주변 공간이 흡수하거나 반사하는 광원으로, 모든 객체에 균일하게 영향을 미칩니다. 이는 물체가 어두운 상황이더라도 완전히 검게 그 물체가 보이지 않도록 방지합니다.

2. 방향 광원 (Directional Light)

방향 광원은 특정 방향에서 나오는 광원으로, 모든 지점에 일정하게 조명을 제공합니다. 태양 등이 이에 해당합니다.

3. 점 광원 (Point Light)

점 광원은 특정 위치에서 모든 방향으로 균일하게 조명을 발산하는 광원으로, 전통적으로 가장 많이 사용됩니다. 불의 빛 등이 이에 해당합니다.

조명 모델

OpenGL에서는 조명의 영향을 계산하는 데 램버트(Lambert), 빈-폰(gouraud) 및 푸른-폰(phong)과 같은 조명 모델을 사용합니다.

1. Lambert 모델

램버트 모델은 빛의 강도가 표면의 각도에 따라 변하는 모델로, 텍스처 및 광택을 고려하지 않습니다. 이 모델은 표면의 방향에 따라 빛의 세기를 조절합니다.

2. 빈-폰(Gouraud) 및 푸른-폰(Phong) 모델

빈-폰 및 푸른-폰 모델은 광원 모델링을 위한 빛도 변화률을 계산합니다. 표면의 광택과 관련된 정보를 효과적으로 다룹니다.

코드 예제

다음은 OpenGL에서 점 광원을 설정하는 코드의 예시입니다.

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

GLfloat lightPos[] = { 0.0f, 10.0f, 0.0f, 1.0f };  // 광원의 위치
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

GLfloat lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };   // 환경 광원
GLfloat lightDiffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };   // 방향 광원
GLfloat lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };  // 빛의 반사

glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);

결론

OpenGL에서 광원과 조명은 3D 그래픽을 현실적으로 표현하는 데 필수적입니다. 또한, 조명 모델 선택 및 광원 설정은 그림의 질과 현실성에 큰 영향을 미칩니다.

관련자료: