All Articles

OpenGL 강좌 _ 2강. 2D Programming

Image

* OpenGL C++ 프로젝트의 기본 코드

OpenGL 초기 버전의 기본코드이며, main 내에서 RenderScene, Init, ChangeSize를 각각의 맞는 함수에서 불러옵니다.

다음 코드박스에 해당 하는 부분을 순서대로 입력하시면 됩니다.

#include <Windows.h> // Master include file for Windows Application
#include <gl/GL.h> // OpenGL Core Library
#include <gl/GLU.h> // OpenGL Utility Library
#include <gl/glut.h> // OpenGL Utility Toolkit

1. Init (네이밍 수정 가능)

// Setup the rendering state
void Init(void)
{
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Set RGBA to 1, 1, 1, 1
}
  • Init이란 메서드명은 사용자가 임의로 수정이 가능하며, 관습적으로 Initiating 을 목적으로 만든 메서드입니다.

2. ChangeSize (네이밍 수정 가능)

// Called by GLUT library when the window has changed size
void ChangeSize(int width, int height)
{
	GLfloat aspectRatio;
    
    // Prevent a divide by zero
    if (height == 0) height = 1;

    glViewport(0, 0, width, height);

    // Set Viewport to window dimensions
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    aspectRatio = (GLfloat)width / (GLfloat)height; // Screen width/height 

    if (width <= height)
    {
        gluOrtho2D(-2.0, 2.0, -2.0 * (float)height / (float)width, 2.0 * (float)height / (float)width);
    }
    else
    {
        gluOrtho2D(-2.0 * (float)width / (float)height, 2.0 * (float)width / (float)height, -2.0, 2.0);
    }

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
  • main 메서드에서 glutReshapeFunc 의 파라미터로 호출되는 메서드입니다.
  • 윈도우의 크기가 변할 때 glutReshpeFunc 메서드가 호출됩니다.
  • 해당 메서드에서 width, height, aspectRatio(화면 가로비율/세로비율)을 받고 이를 통해 카메라의 위치를 조정합니다.
  • glOrtho 부분이 카메라의 위치를 조정하는 부분인데 다른 포스팅에서 추가로 설명하겠습니다. ( 카메라 모드 설명 )
  • glMatrixMode 와 glLoadIdentity 는 Matrix 곱을 하는 부분인데, 이 부분도 다른 포스팅에서 추가로 설명하겠습니다. ( Multiplex matrix )

3. RenderScene

void RenderScene() 
{
	// Clear the window with current clearing color
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3f(1, 0, 0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(0, -0.5);
	glVertex2f(0, 0);
	glVertex2f(-0.5, 0);
	glEnd();

	// Flush drawing commands
	glFlush();
}
  • main 메서드에서 glutDisplayFunc 의 파라미터로 호출되는 메서드입니다.
  • glutMainLoop 로 인해 매 프레임마다 호출됩니다.
  • glClear 2. Init 메서드에서 glClearColor에 입력한 생상으로 창의 색을 흰색으로 갱신합니다.
  • glColor3f는 RGB 값을 1, 0, 0 으로 설정한 뒤 Color Buffer에 보관합니다.
  • glBeginglEnd 사이에서 Vertex의 위치가 (-50, -50), (0, -50), (0, 0), (-50, 0)인 GL_POLYGON 형태로 그립니다.

4. main 메서드

// Main program entry point
int main(int argc, char* argv[])
{
	glutInit(&argc, argv); // Initialize GLUT Library
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // Set Display Mode 
	glutInitWindowSize(600, 600); // width 600, height 600
	glutCreateWindow("GL1"); // Create new Window App "GL1"
	glutReshapeFunc(ChangeSize);

	Init();

	glutMainLoop(); // GLUT, GL Routine
	return 0;
}
  • 프로그램 동작시 main으로 동작하는 부분이며, glutMainLoop 로 화면을 그리기전에 glut 와 관련된 메서드로 library 를 초기화합니다.

5. 결과물 확인

Image

* 전체코드 확인