ClanLIB를 이용해서 OpenGL 프로그래밍 하던 중에 궁금한점????

vaijra의 이미지

라이브러리 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;
kane의 이미지

vaijra wrote:
2번째는....
라이트 효과를 주기위해서 glEnable(GL_LIGHTING) 추가를 하면 또한 화면이 검정색으로 나옵니다.
라이트효과를 주기위해 어느 부분을 수정 또는 추가를 해야 할까요?

OpenGL에 대해서는 잘 모르지만... 추측을 해보면
광원을 사용하겠다고만 하고 광원 자체에 대한 내용이 없는 것 같습니다.
구글님께 여줘보니 보통
glEnable(GL_LIGHTING);
다음에
glEnable(GL_LIGHT0);
를 사용해주거나
glLightfv()를 이용해서 GL_LIGHT0 등을 설정해주는 코드가 있네요.
광원효과를 사용할때 기본적으로 사용되는 광원이 있는지,
기본적으로 사용하는 광원이 있다면 그 설정은 어떻게 되어있는지 찾아보셔야 할 것 같습니다.
좀 더 예제 코드와 튜토리얼 등을 찾아서 테스트해보세요. :)