위와 같은 검은 배경의 흰색 사각형을 OpenGL을 이용해서 그려보자.
GL
: 렌더링 기능을 제공하는 라이브러리
GLU
: GL 라이브러리의 도우미 역할을 하는 라이브러리
- 약 50여개의 함수로 구성
- 다각형분할(Tessellation), 투상(Projection), 2차원 곡면(Quadratic Surface), 너브스(NURBS) 등 고급기능을 제공
운영체제와 시스템 수준의 입출력을 가능하게 만드는 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);
무한 이벤트 처리 루프, 이벤트가 발생하면 일치하는 콜백 함수가 등록되어 있을 경우, 등록된 함수가 자동으로 호출