[OpenGL] 사각형 그리기

심주흔·2024년 3월 20일
0

컴퓨터그래픽스

목록 보기
2/7
post-thumbnail

위와 같은 검은 배경의 흰색 사각형을 OpenGL을 이용해서 그려보자.

🧴 들어가기 전

🧽 GL & GLU : OpenGL Utility Library

GL : 렌더링 기능을 제공하는 라이브러리
GLU : GL 라이브러리의 도우미 역할을 하는 라이브러리
- 약 50여개의 함수로 구성
- 다각형분할(Tessellation), 투상(Projection), 2차원 곡면(Quadratic Surface), 너브스(NURBS) 등 고급기능을 제공

🧽 GLUT : OpenGL Utility Toolkit

운영체제와 시스템 수준의 입출력을 가능하게 만드는 OpenGL 프로그램용 유틸리티 라이브러리로 사용자 입력을 받아들이거나 화면 윈도우를 제어하기 위한 함수

  • 운영체제에 대한 깊이 있는 지식이 없더라도 쉽게 프로그램 작성 가능
  • 창의 크기와 형태를 정의하고 제어
  • 키보드와 마우스 입력을 감지하는 기능
  • 정육각형, 구, 찻잔 같은 기하학적인 기본 객체 제공
  • 팝업 메뉴를 생성하는 기능 제공
  • glut 라는 접두사로 시작: glutPostRedisplay, glutCreateWindwo ...

🧴 소스코드

#define GL_SILENCE_DEPRECATION      //버전 오류 해결

#include <iostream>
#include <OpenGL/gl.h>
#include <OpenGl/glu.h>
#include <GLUT/glut.h>

void display(void){
    glClear(GL_COLOR_BUFFER_BIT); //색상 버퍼를 지움.
    glColor3f(1.0, 1.0, 1.0);       //흰색으로 설정
    
    //사각형의 좌표 입력
    glBegin(GL_POLYGON);
    // z 좌표는 0 => 원근감이 없기 때문 (평면 사각형)
    glVertex3f(0.25, 0.25, 0.0);
    glVertex3f(0.75, 0.25, 0.0);
    glVertex3f(0.75, 0.75, 0.0);
    glVertex3f(0.25, 0.75, 0.0);
    
    glEnd();
    
    glFlush();  //사각형을 화면에 그림
}

void init(void){
    glClearColor(0.0, 0.0, 0.0, 0.0);       //윈도우 배경을 검은색으로 설정
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();                       //단위 행렬
    
    //직교 투영 : left, right, bottom, top, near, far
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

}

int main(int argc, char** argv){
    glutInit(&argc, argv);          //GLUT 사용을 초기화
    
    //디스플레이모드 형식 선택: single buffer & RGBA color 모드 선택
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    
    // 창의 크기와 위치 설정
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(100, 100);
    
    //필요한 콜백함수 등록
    glutCreateWindow("01 사각형 그리기");     //윈도우 생성
    init();
    
    //필요한 콜백함수 등록
    glutDisplayFunc(display);
    glutMainLoop();         //이벤트 처리엔진 시작
    
    return 0;
}

🧴 주요 함수 설명

void glutInit(int *argc, char **argv);
GLUT 라이브러리를 초기화하고 기반 플랫폼의 윈도우 시스템과 연결하여 하나의 세션 형성하기 때문에 다른 어떤 GLUT 함수보다 먼저 실행 되어야함.

void glutInitDisplayMode(unsigned int mode);
그리기 표면의 주요 특징들을 결정, 한 번 윈도우를 생성한 후에는 변경할 수 없음. 여러 개의 모드를 OR 연산자로 묶어서 지성(상호 배타적인 속성의 플래그들은 하나만 지정 가능)

void glutInitWindowSize(int width, int height);
그래픽을 출력할 윈도우의 크기(너비와 높이)를 지정

void glutInitWindowPosition(int x, int y);
화면 좌상단을 원점 으로 하여 x,y 위치에 윈도우의 좌상단을 위치시킴

int glutCreateWindow(char *name);
윈도우를 생성, 윈도우 상단의 제목을 문자열 인수로 지정, 새로운 윈도우에 대한 ID값이 return 됨. glutMainLoop()가 호출되기 전까지는 윈도우 디스플레이 되지 않음.

void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
윈도우의 배경을 지울 때 사용될 색상을 지정
4개의 인수는 RGBA 각 색상의 요소의 강도를 지정 (0 ~ 1)

void glMatrixMode(GLenum mode);
사용할 행렬 모드를 지정

void glLoadIdentity();
행렬을 단위 행렬로 초기화

🛀 void glOrtho(A, B, C, D, E, F);

A: GLdouble left
B: GLdouble right
C: GLdouble bottom
D: GLdouble top
E: GLdouble nearVal
F: GLdouble farVal
직교 투영을 위한 범위 설정, 멀고 가까움은 표현 불가 => Z 좌표는 무의미하다. Z 좌표 값은 0.0 임

glBegin() 을 사용하여 사각형의 좌표를 입력할 때 범위 안에 있어야만 화면에 출력

void glutDisplayFunc(void(*func)(void));
디스플레이 콜백 함수

  • Display 콜백 함수가 호출 되는 경우
    -처음 윈도우를 열 때
    -윈도우 위치를 옮길 때
    -윈도우 크기를 조절할 때
    -앞 윈도우에 가려져 안 보이던 뒤 윈도우가 활성화 되어 앞으로 드러날 때
    • glutPostRedisplay() 함수에 의해 이벤트 큐에 flag가 게시될 때
  • 콜백 함수
    -필요한 콜백 함수를 등록하고 해당 콜백함수에 실행될 내용을 입력
    -콜백 함수에 대한 호출은 GLUT가 알아서 처리함

void glClear(GLbitfield mask);
인수로 어떤 버퍼를 지울 것인가를 지정
OR 연산자로 연결하여 두 개 이상의 버퍼를 한꺼번에 지울 수 있음

void glColor(GLfloat red, GLfloat green, GLfloat blue);
RED, GREEN, BLUE 를 이용한 색상 지정(0.0 ~ 1.0)

void glBegin(GLenum mode); void glEnd(void);
선, 점, 면 등을 그리기 위해 사용, glBegin()과 glEnd()의 사이의 정점 정보를 넣음


value 값점의 좌표 순서를 바꾸면서 원하는 도형을 그려보자.

void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
정점의 x, y, z 좌표 설정

void glFlush(void);
버퍼에서 기다리던 명령들을 실행

void glutMainLoop(void);
무한 이벤트 처리 루프, 이벤트가 발생하면 일치하는 콜백 함수가 등록되어 있을 경우, 등록된 함수가 자동으로 호출

profile
이봐... 해보기는 했어?

0개의 댓글