[OpenGL Tutorial] Fog

사용자 삽입 이미지이장에서는 OpenGL에서 안개 효과를 얻는 것에 대해서 알아보자. OpenGL은 안개 효과를 얻기 위해 특별한 트릭을 사용해야하는 것이 아니라 안개 효과를 위한 API를 제공함으로써 쉽게 안개 효과를 얻을 수 있다.

OpenGL에서 제공하는 안개의 종류는 3가지가 있는데 사실 2가지로 구분된다. 하나는 GL_EXP와 GL_EXP2이고 다른 하나는 GL_LINEAR이다. GL_EXP와 GL_EXP2는 밀도라는 값을 이용해서 화면 전체에 지정된 안개의 색으로 마치 자욱한 연기 안에 물체들이 놓여있는 듯한 효과를 낸다. GL_LINEAR은 안개가 이제 막 시작되는 깊이와 안개가 완전하게 들이워져서 더 이상 물체가 보이지 않을 깊이를 지정함으로써 사실 가장 실제적인 안개 효과를 연출할 수 있다. 이론 설명은 여기서 마치기로 하고 코딩에 들어가보자. 6장에서 만든 코드에서부터 시작해보자.

먼저 안개에 대해서 설정해야 할 값들이 있다. initGL 함수의 구현부에 다음과 같은 배열을 선언한다.

GLfloat fogColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };

위의 배열은 안개의 색상을 지정하데 쓰인다. 안개에도 빨간 안개, 노란 안개, 파란 안개 등 찢어진 안개만 빼고 어떤 색의 안개가 가능하다. ^^;;

다음으로 initGL에서 수정해야할 것이 있는데 이것은 배경색을 다르게 지정하는 것이다. 우리가 지금까지 배경색을 완전한 검정색으로 사용했음을 알고 있는가? 즉 다음의 코드가 이와같은 일을 처리했었다.

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

그러나 우리는 지금 안개를 보다 리얼하게 나타내기 위해서 배경색 조차도 안개의 색에 마춰야 한다. 다음과 같이 변경하자.

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

다음에 initGL에서 추가해야할 것은 안개에 대한 설정값들이다. 다음의 코드를 추가하자.

glFogi(GL_FOG_MODE, GL_LINEAR); // <1>
glFogfv(GL_FOG_COLOR, fogColor); // <2>
glFogf(GL_FOG_DENSITY, 0.3f); // <3>
glHint(GL_FOG_HINT, GL_NICEST); // <4>
glFogf(GL_FOG_START, 5.5f); // <5>
glFogf(GL_FOG_END, 7.0f); // <6>
glEnable(GL_FOG); // <7>

<1>번은 안개 모드를 GL_LINEAR로 해준다는 것이다. 앞에서 우리는 GL_LINEAR와 GL_EXP, GL_EXP2와 같은 안개의 종류가 있다는 것에 대해 알고 있다.

<2>번은 안개의 색을 지정하는 코드이다.

<3>번은 안개의 밀도를 지정하는 것인데 GL_EXP, GL_EXP2에서만 사용되는 값이다.

<4>번은 안개에 대한 연출에 있어서 가장 멋있게 보이도록 OpenGL에게 신경써 달라는 요청이다.

<5>번은 GL_LINEAR에서만 적용되는 것으로써 안개가 나타나기 시작하는 깊이(Z축 값) 거리를 설정하는 것이다.

<6>번은 GL_LINEAR에서만 적용되는 것으로써 안개가 완전이 들이워져서 물체가 더이상 보이지 않을 정도가 되는 깊이(Z축 값) 거리를 설정하는 것이다.

<7>번은 이렇게 설정한 값들을 이용해서 안개 효과를 사용하겠다는 것이다.

끝이다! ^^

이렇게 해주면 안개는 우리가 원하는 모습으로 나타날 것이다. 아래는 그 결과 화면이다.


사용자 삽입 이미지


어떤가? 차라리 안개라기 보다 눈속에 파뭍친 것 같지 않은가? ^^

안개 효과에 대해서 마치기 전에 이제 GL_EXP모드의 안개에 대해서 알아보자. GL_EXP 모드를 사용하기 위해서 변경해야 코드는 위에서 설펴본 코드중에 <1>번 코드의 두번재 인자를 GL_EXP로 변경하고 <3>번 코드에서 적절한 밀도값을 설정하기만 하면된다. 그렇게 설정했을때 나타나는 결과 화면은 다음과 같다.


사용자 삽입 이미지


마치 구름속에 파뭍힌 것 같다. 참고로 GL_EXP2는 GL_EXP보다 같은 밀도라고 해도 더 짙은 안개 효과를 나타낸다.

자!! 이렇게 해서 안개에 대한 것들을 마친다.

“[OpenGL Tutorial] Fog”에 대한 11개의 댓글

  1. 김형준 개발자님 튜토리얼 항시 잘보고 있습니다.
    많은 참조가 되고 있습니다.
    김형준 개발자님 혹시 OBJ파일을 불러오는 방법은 어떻게 하는지 아시는지요?
    지금 튜토리얼에서는 안보여서 상당히 어렵네요…
    제가 만들려는것이 놀이동산의 바이킹을 만들려고 하는데 바이킹의 배부분은 마야로 작업
    을 해서 OBJ파일로 만들었습니다. 그러나 OPENGL에서 호출하는것이 상당히 어렵네요
    조언 부탁드립니다.

  2. 임태환님~ 인터넷 상에 OpenGL을 이용해서 obj를 읽어 들이는 많은 소스가 있답니다. 음.. 제가 3ds 파일을 읽어 들이는 소스 코드가 있기는 한데… 필요하면 말씀하세요~ ^^

YH에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다