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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.