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 등을 설정해주는 코드가 있네요.
광원효과를 사용할때 기본적으로 사용되는 광원이 있는지,
기본적으로 사용하는 광원이 있다면 그 설정은 어떻게 되어있는지 찾아보셔야 할 것 같습니다.
좀 더 예제 코드와 튜토리얼 등을 찾아서 테스트해보세요. :)
댓글 달기