OpenGL / GLUT Programming
void glutInit(int *argc, char **argv)
//GLUT와 OpenGL 환경을 초기화하고, main의 인수를 그대로 전달
void glutInitWindowSize(int width, int height)
//윈도우 크기를 지정
void glutInitWindowPosition(int x, int y)
//윈도우 위치를 설정
void glutCreateWindow(char *name)
//윈도우를 생성하고, name은 타이틀 바에 표시됨
void glutDisplayFunc(void (*func) (void))
//func은 윈도우 내에 디스플레이 하는 callback 함수 포인터
//윈도우가 생성되거나, 다른 윈도우에 의해 가려진 윈도우가 다시 디스플레이 될 때 이 함수가 실행됨
void glutMainLoop(void)
//GLUT 루프로, 프로그램은 이벤트를 기다리는 상태임.
void glutInitDisplayMode(unsigned int mode)
//디스플레이의 표시모드를 설정. GULT_RGBA를 지정하면 색의 지정을 RGB로 사용함
//인덱스 컬러모드(GLUT_INDEX)를 지정하면 효율을 향상시킬 수 있음
void glClearColor(Glclampf R, Glclampf G, Glclampf B, Glclampf A)
//배경색 지정 함수, 타입명에 clamp가 들어가면 0~1 사이의 값만 들어감
//알파값은 투명도
//(0, 0, 0, 1) 을 지정하면 검정색 불투명으로 배경색 지정
void glClear(Glbitfield mask)
//윈도우를 칠함. Mask에는 칠할 버퍼를 지정함
//OpenGL이 관리하는 화면상의 버퍼(메모리)에는 color buffer, depth buffer, stencil buffer, overlay buffer 등이 존재함
//GL_COLOR_BUFFER를 지정하면 컬러버퍼만 전부 칠해짐
void glFlush(void)
//이 함수는 아직 실행되지 않은 OpenGL 명령을 전부 실행함
더보기
- glutInit(int *argc, char **argv) : GLUT 라이브러리를 초기화한다. main의 인수를 받아와서 GLUT에 전달한다.
- glutInitWindowSize(int width, int height) : 생성될 윈도우의 초기 크기를 지정한다.
- glutInitWindowPosition(int x, int y) : 생성될 윈도우의 초기 위치를 지정한다.
- glutCreateWindow(char *name) : 윈도우를 생성하고 이름을 지정한다.
- glutDisplayFunc(void (*func) (void)) : 윈도우가 업데이트될 때 호출되는 콜백 함수를 등록한다. 함수의 포인터가 들어감. display 이벤트가 발생하면 호출될 콜백 정의
- glutMainLoop(void) : GLUT 이벤트 루프를 시작한다. 이벤트 루프는 사용자 입력에 반응하고, 콜백 함수를 호출하고, 화면을 업데이트한다. 이 루프는 사용자가 종료 요청을 할 때까지 계속된다. 모든 지엘 프로그램은 항상 이 함수로 끝남.
- glutInitDisplayMode(unsigned int mode) : 이 함수는 OpenGL 디스플레이 모드를 초기화한다. mode 매개변수는 디스플레이 모드를 지정하는 비트마스크이다. 이 함수는 윈도우를 생성하기 전에 호출되어야 하며, 더 이상 모드를 변경할 수 없는 상태가 되기 때문에 프로그램 시작 시 한 번만 호출되어야 한다.
- glClearColor(Glclampf R, Glclampf G, Glclampf B, Glclampf A) : 이 함수는 현재 프레임버퍼의 모든 픽셀을 지정된 색으로 지운다. R, G, B, A는 0과 1 사이의 부동소수점 값으로, 각각 빨강, 녹색, 파랑, 알파 값을 나타낸다. 알파값은 투명도
- glClear(Glbitfield mask) : 이 함수는 현재 OpenGL 컨텍스트의 프레임버퍼를 비운다. mask는 GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT 등과 같은 비트마스크를 사용하여 프레임버퍼의 특정 부분을 선택할 수 있다. or를 사용하여 칠할 버퍼 지정 가능
- glFlush(void) : 이 함수는 현재 명령 대기열에서 대기 중인 모든 OpenGL 명령을 즉시 실행한다. 일반적으로 이벤트 처리 루프 외부에서 OpenGL 명령을 즉시 실행해야 할 때 사용된다.
glut로 시작하면 glut에서 온 것. gl로 시작하면 gl에서 온 것. glu는 대표적으로 윈도우를 만들기 위한 것임.
입력 콜백과 GLUT
- 지엘 프로그램은 윈도우 기능 및 입출력 제어에 있어서 GLUT 라이브러리를 이용함. 이 경우 GLUT는 그림과 같이 지엘 프로그램과 드라이버 사이에서 인터페이스 역할을 함. 따라서 프로그래머는 드라이버를 직접 상대하는 대신 GLUT에게 필요한 일을 시키면 됨.
- GLUT의 장점은 프로그램의 간편성에 있음. 프로그래머가 필요한 콜백 함수를 등록하고, 해당 콜백 함수에 원하는 내용을 채워넣기만 하면, 이에 대한 호출은 GLUT가 알아서 처리함. 이를 위해 GLUT는 프로그래머가 등록한 함수를 콜백 테이블(Callback Table) 형태로 저장하며, 이 테이블에는 표와 같이 이벤트 타입별로 불러야 할 콜백 함수명이 저장됨.
- 이후 GLUT는 드라이버로부터 받은 이벤트 레코드를 참고해 이벤트 타입을 판단하고 테이블을 검색하여 그에 맞는 콜백 함수를 호출함. 이때 이벤트 레코드의 메저는 파라미터 형태로 콜백 함수에 전달됨.
- 아이들 콜백
- 큐에 이벤트가 없을 때 실행
- 정의되어 있지 않으면 운영체제는 다른 일을 수행
- 드라이버를 통해 주기적으로 이벤트 검사
- GLUT는 프로그램 실행 시 위 그림과 같은 이벤트 루프를 돈다. 만약 큐에 이벤트가 있으면 첫 번째 이벤트를 가져와서 해당 타입에 맞는 콜백 함수를 호출하고, 다시 루프로 들어가 다음 이벤트가 있는지 검사함. 일반적으로 큐에 이벤트가 하나도 없으면, 운영체제는 현재 프로그램 외에 다른 일을 실행함.
- 프로그램에서 아이들 콜백 함수 (Idle Callback Function)를 정의하면 아이들 콜백 함수가 자동 호출되어 실행됨. 이 함수는 주로 다른 모든 이벤트가 없는 시간을 활용하여 필요한 계산을 하는 데 사용됨.

GLUT Callbacks
-
GLUT defines a basic program structure – an event loop, with callback functions
-
Callback, a function that you provide for other code to call when needed; the “other code” is typically in a library
-
GLUT uses callbacks for drawing, keyboard, mouse input, and other events
-
Whenever the window must be redrawn, your drawing callback is called.
-
Whenever an input event occurs, your corresponding callback is called.
더보기
GLUT는 기본적인 프로그램 구조를 정의함. – 이벤트 루프, 콜백 함수를 사용함
콜백은 필요에 따라 다른 코드를 호출하기 위해 제공하는 함수. 일반적으로 '다른 코드'는 라이브러리에 있음.
GLUT는 그리기, 키보드, 마우스 입력 및 기타 이벤트에 콜백을 사용함
창을 다시 그려야 할 때마다 그리기 콜백이 호출됨.
입력 이벤트가 발생할 때마다 해당 콜백이 호출됨.
glutDisplayFunc
glutPostRedisplay
glutIdleFunc
glutTimerFunc
glutGetModifiers
glutIngoreKeyRepeat
glutKeyboardFunc
glutKeyboardUpFunc
glutMouseFuc
glutCreateMenu
glutAttachMenu
glutSpecialFunc
glutSpecialUpFunc
Simple OpenGL Program (FirstTriangle.cpp)
#include <GL/freeglut.h> // we use glut here as window manager
#include <iostream>
using namespace std;
class Renderer {
public:
void init() {}
void resize(int w, int h) {
glViewport(0, 0, w, h);
}
void display() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5f, -0.5f, 0.0f); // vertex on the left
glVertex3f(0.5f, -0.5f, 0.0f); // vertex on the right
glVertex3f(0.0f, 0.5f, 0.0f); // vertex at the top of the triangle
glEnd();
}
void dispose() {
}
};
//this is a static pointer to a Renderer used in the glut callback functions
static Renderer* renderer;
//glut static callbacks start
static void glutResize(int w, int h)
{
renderer->resize(w, h);
}
static void glutDisplay()
{
renderer->display();
glutSwapBuffers();
}
static void glutClose()
{
renderer->dispose();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(320, 320);
glutCreateWindow("GlutFirstTriangle");
glutDisplayFunc(glutDisplay);
glutReshapeFunc(glutResize);
glutCloseFunc(glutClose);
renderer = new Renderer;
renderer->init();
glutMainLoop();
}
'전공 > 컴퓨터 그래픽스' 카테고리의 다른 글
OpenGL 기본 틀 (5)_더블 버퍼링 (0) | 2023.04.09 |
---|---|
OpenGL 기본 틀 (4)_윈도우와 뷰포트 (0) | 2023.04.09 |
OpenGL 기본 틀 (2)_입력 모드 (0) | 2023.04.09 |
OpenGL 기본 틀 (1)_그래픽 입력장치 (0) | 2023.04.09 |
OpenGL 소개 (0) | 2023.04.08 |
댓글