ClanLIB를 이용해서 OpenGL 프로그래밍 하던 중에 궁금한점????
글쓴이: vaijra / 작성시간: 수, 2005/04/20 - 8:46오후
라이브러리 ClanLib를 이용하여 OpenGL 프로그래밍 하던중에 막히는 부분이 있어서 글 올립니다...
기본적인 큐브 회전하는 것입니다....
1번째는....
다른 게임 소스에서는 set_active() 가 없어도 되는거 같은데 아래소스에서는 주석처리하면 화면이 검정색으로 나옵니다.
2번째는....
라이트 효과를 주기위해서 glEnable(GL_LIGHTING) 추가를 하면 또한 화면이 검정색으로 나옵니다.
라이트효과를 주기위해 어느 부분을 수정 또는 추가를 해야 할까요?
#include <ClanLib/core.h> #include <ClanLib/application.h> #include <ClanLib/display.h> #include <ClanLib/gl.h> GLint winH=800; GLint winW=600; Bool light; /* Lighting on/off */ CL_OpenGLState *glstate; CL_OpenGLSurface *texture; float rotX = 0.0f; float rotY = 0.0f; float rotZ = 0.0f; int DrawGLScene(GLvoid) { glstate->set_active(); // <==== 궁금 [1] glDisable(GL_DEPTH_TEST); if (!light) // <======= 궁금 [2] glDisable(GL_LIGHTING); else glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(rotX, 1.0f, 0.0f, 0.0f); /* rotate on the X axis */ glRotatef(rotY, 0.0f, 1.0f, 0.0f); /* rotate on the Y axis */ glRotatef(rotZ, 0.0f, 0.0f, 1.0f); /* rotate on the Z axis */ texture->bind(); // glBindTexture(GL_TEXTURE_2D, texture[0]); /* select our texture */ glBegin(GL_QUADS); /* front face */ glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); /* back face */ glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); /* right face */ glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); /* left face */ glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); /* top face */ glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); /* bottom face */ glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glEnd(); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); /* change the rotation angles */ rotX += 0.3f; rotY += 0.2f; rotZ += 0.4f; return True; } void init() { glstate->set_active(); // <==== 궁금 [1] glMatrixMode(GL_MODELVIEW); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport(0, 0, winW, winH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)winW / (GLfloat)winH, 0.1f, 1000.0f); glMatrixMode(GL_MODELVIEW); texture = new CL_OpenGLSurface("data/texture.jpg"); } class mainApp:public CL_ClanApplication { public: virtual int main( int argc, char**argv ) { // Create a console window for text-output if not available CL_ConsoleWindow console( "Console" ); console.redirect_stdio(); quit=false; try { CL_SetupCore::init(); CL_SetupDisplay::init(); CL_SetupGL::init(); CL_DisplayWindow window( "mainApp", winW, winH ); glstate = new CL_OpenGLState(window.get_gc()); CL_Slot slot_quit=window.sig_window_close().connect( this, &mainApp::on_window_close ); CL_Slot slot_input_up=( window.get_ic()->get_keyboard() ).sig_key_up().connect( this, &mainApp::on_input_up ); init(); //Run until someone presses escape while( !quit ) { DrawGLScene(); CL_Display::flip(); CL_System::keep_alive(); } CL_SetupGL::deinit(); CL_SetupDisplay::deinit(); CL_SetupCore::deinit(); } catch( CL_Error error ) { std::cout<<"Exception caught : " <<error.message.c_str()<<std::endl; console.display_close_message(); return -1; } return 0; } private: bool quit; void on_input_up( const CL_InputEvent&key ) { if( key.id==CL_KEY_ESCAPE ) quit=true; if( key.id==CL_KEY_L ) light=!light; } void on_window_close() { quit=true; } } my_app;
Forums:
Re: ClanLIB를 이용해서 OpenGL 프로그래밍 하던 중에 궁금한점?
OpenGL에 대해서는 잘 모르지만... 추측을 해보면
광원을 사용하겠다고만 하고 광원 자체에 대한 내용이 없는 것 같습니다.
구글님께 여줘보니 보통
glEnable(GL_LIGHTING);
다음에
glEnable(GL_LIGHT0);
를 사용해주거나
glLightfv()를 이용해서 GL_LIGHT0 등을 설정해주는 코드가 있네요.
광원효과를 사용할때 기본적으로 사용되는 광원이 있는지,
기본적으로 사용하는 광원이 있다면 그 설정은 어떻게 되어있는지 찾아보셔야 할 것 같습니다.
좀 더 예제 코드와 튜토리얼 등을 찾아서 테스트해보세요. :)
댓글 달기