[App 개발] NeHe Lesson 16
본문
당신의 OpenGL 프로그램에 안개를 넣고 싶으십니까? 이번 강의에서 바로 그 방법을 보여드리려고 합니다. 저는 강의를 쓰는 것은 처음이고, OpenGL/C++ 프로그래밍은 근래에 시작한 것이기 때문에, 만일 프로그램에 무엇인가 잘못이 있다면 알려주십시오. 이 프로그램은 lesson 7 의 코드를 기초로 만들었습니다.
데이터 셋업:
먼저 안개 정보를 기록할 변수들을 선언하는 것으로 시작하겠습니다. fogMode변수는 GL_EXP, GL_EXP2, GL_LINEAR 세 가지 형태의 안개를 저장하는 데 쓰입니다. 이후에 이들의 차이점을 설명하겠습니다. 다음의 변수들을 GLuint texture[3] 코드 다음에 기록하면 됩니다. fogfilter변수는 어떤 형태의 안개를 현재 쓰고있는지 기록하는 변수입니다. fogColor변수는 안개가 갖는 색상의 정보를 담고 있습니다. 그리고 논리변수 gp를 프로그램 서두에 선언하여 이후에 추가할 g 키가 눌렸는지를 판정하는 코드에서 사용합니다.
bool gp; // G 키가 눌렸는가
GLuint filter; // 어떤 필터를 사용하고 있는가
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // 세 가지 안개의 형태를 저장한다
GLuint fogfilter= 0; // 어떤 안개를 사용하고 있는가
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // 안개 색상
DrawGLScene 함수의 설정
변수 설정은 끝났고 이제 InitGL함수로 넘어가겠습니다. 좀 더 나은 효과를 위하여 안개의 색상과 동일한 색으로 화면을 만들기 위하여 glClearColor() 함수가 변경되었습니다. 안개 만들기에 동원된 코드는 그렇게 많지 않습니다. 아주 쉽다는 것을 발견하실 것입니다.
glClearColor(0.5f,0.5f,0.5f,1.0f); // 안개 색깔과 똑같은 색으로 화면 지우기
glFogi(GL_FOG_MODE, fogMode[fogfilter]); // 안개의 모드
glFogfv(GL_FOG_COLOR, fogColor); // 안개 색상
glFogf(GL_FOG_DENSITY, 0.35f); // 안개의 밀도
glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint
glFogf(GL_FOG_START, 1.0f); // 안개 시작 깊이
glFogf(GL_FOG_END, 5.0f); // 안개 끝 깊이
glEnable(GL_FOG); // GL_FOG 활성화
앞의 세 줄은 남겨두겠습니다. 첫 번째 줄의 glEnable()은 설명 안 해도 아실 것입니다. 안개를 초기화하는 것입니다.
두 번재 줄의 glFogi(GL_FOG_MODE, fogMode[fogfilter]) 함수는 안개 필터의 모드를 설정합니다. 위에서 우리는 GL_EXP, GL_EXP2, GL_LINEAR 값을 가지는 fogMode 라는 배열을 정의했습니다. 여기서 그 값들이 사용되는데, 하나씩 설명하겠습니다.
GL_EXP 전체 화면에 안개를 만드는 방법. 쓸만한 안개 효과를 만들 수는 없지만 옛날 컴퓨터에서도 작동된다.
GL_EXP2 GL_EXP의 향상된 방법. 화면에 모두 안개를 만들지만 좀 더 깊은 곳에 만든다.
GL_LINEAR 가장 좋은 랜더링 방법. 안개에 의하여 물체의 원근이 드러난다.
세 번째 줄의 glFogfv(GL_FOG_COLOR, fogcolor)함수에서 안개의 색상을 지정합니다. 먼저 우리는 이 값을 fogcolor에 멋있는 회색 빛깔(0.5f,0.5f,0.5f,1.0f)로 지정했습니다.
계속해서 밑의 네 줄을 살펴보겠습니다. glFogf(GL_FOG_DENSITY, 0.35f)는 안개의 밀도를 정하는 함수입니다. 숫자가 증가되면 안개는 짙어지고 숫자가 작아지면 안개는 옅어집니다.
다음 줄 glHint(GL_FOG_HINT,GL_DONT_CARE) 함수는 hint 값을 설정합니다. 여기서는 hint 값과 관계 없으므로 GL_DONT_CARE를 넣었습니다.
Eric Desrosiers 의 첨언: glHint(GL_FOG_HINT,hintval)함수에 대해서 약간 설명하겠습니다.
hintval인수는 GL_DONT_CARE, GL_NICEST, GL_FASTEST 중에서 선택할 수 있습니다.
gl_dont_care OpenGL이 fog per vertex 나 fog per pixel 중에서 선택한다
gl_nicest fog per pixel 을 선택한다 (보기 좋다)
gl_fastest fog per vertex 을 선택한다 (빠르다)
다음 줄 glFogf(GL_FOG_START, 1.0f)함수는 안개의 시작 위치가 화면에서 얼마나 가까운지를 설정합니다. 안개가 시작되는 위치에 따라 값을 변경할 수 있습니다. 다음 줄은 비슷합니다. glFogf(GL_FOG_END, 5.0f)함수는 안개가 얼마나 멀리까지 진행되는지를 설정합니다.
키 입력 이벤트
이제까지 안개 입력을 지정했고 지금부터는 키보드 명령으로 안개 모양을 바꾸는 프로그램입니다. 이 코드는 프로그램 맨 밑에 있는 키보드 처리 코드에 추가합니다.
if (keys['G'] && !gp) // G 키가 눌렸나
{
gp=TRUE; // gp 를 TRUE 로 설정
fogfilter+=1; // fogfilter 변수의 값을 하나 증가
if (fogfilter>2) // fogfilter가 2보다 큰가
{
fogfilter=0; // 그렇다면 fogfilter를 0으로 만든다
}
glFogi (GL_FOG_MODE, fogMode[fogfilter]); // 안개 모양 변경
}
if (!keys['G']) // G 키가 떨어졌나
{
gp=FALSE; // 그렇다면 gp를 FALSE로 변경
}
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0