* 출처 : OpenGL로 배우는 3차원 컴퓨터 그래픽스, 한빛아카데미
1. 흑색 바탕에 백색 사각형 그리기
#include <glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON); // 4개의 정점으로 이루어진 다각형
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, -0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush(); // 현재까지 쌓인 명령어 모두를 프로세서에 전달
}
int main() {
glutCreateWindow("OpenGL Drawing Example"); // 새로운 윈도우 생성
glutDisplayFunc(MyDisplay); // 디스플레이 이벤트 발생 -> MyDisplay 콜백 함수 실행
glutMainLoop(); // 이벤트 루프로 진입
return 0;
}
1-1) 디스플레이 콜백 함수 MyDisplay()
- 백색 사각형은 glBegin()과 아래쪽 glEnd() 사이에 정의
- GL_POLYGON은 다각형을 의미하고 그 아래의 glVertex3f는 4개의 정점을 의미한다.
- 드라이버는 일정한 분량의 명령어를 쌓아두었다가 한꺼번에 프로세서에 전달하는데 glFlush() 함수는 더 이상 명령어를 쌓지 말고 현재까지 쌓인 명령어를 프로세서에 전달하는 함수이다.
1-2) main()
- glutCreateWindow() 함수는 새로운 윈도우를 생성하는 함수이다. 이 함수의 파라미터인 "OpenGL Drawing Example"은 윈도우 상단 타이틀 바에 나타난다.
- glutDisplayFunc(MyDisplay) 함수는 디스플레이 이벤트가 발생하면 MyDisplay 콜백 함수를 실행하라는 함수이다.
- glutMainLoop() 명령은 이벤트별로 콜백 함수를 등록했으므로 이벤트 루프로 진입하라는 함수이다. 모든 지엘 프로그램은 항상 이 함수로 끝난다.
2. glViewport() 사용하기
#include <glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT); // 프레임 버퍼 초기화 : 초기화 색 -> main함수의 ClearColor에서 설정한 색
glViewport(0, 0, 300, 300); // 좌하단이 원점
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON); // 4개의 정점으로 이루어진 다각형
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, -0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush(); // 현재까지 쌓인 명령어 모두를 프로세서에 전달
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // glut라이브러리 초기화
glutInitDisplayMode(GLUT_RGB); // 윈도우 기본 컬러 모드 = RGB
glutInitWindowSize(300, 300); // 윈도우 폭 300 높이 300
glutInitWindowPosition(0, 0); // 윈도우의 좌상단을 (0, 0) 즉, 화면 좌표계의 원점
glutCreateWindow("OpenGL Drawing Example"); // 새로운 윈도우 생성
glClearColor(0.0, 0.0, 0.0, 1.0); // 초기화 색 (R, G, B, 불투명도)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glutDisplayFunc(MyDisplay); // 디스플레이 이벤트 발생 -> MyDisplay 콜백 함수 실행
glutMainLoop(); // 이벤트 루프로 진입
return 0;
}
2-1) main()
- glutInitWindowSize(300, 300) 함수를 사용해 윈도우 크기를 폭 300, 높이 300으로 나타낸다.
- glutInitWindowPosition(0, 0) : 윈도우의 좌상단을 (0, 0)에 위치시키는 함수
만약 폭이 400 높이가 300인 윈도우를 (120, 55)에 위치시키면 ?
- glClearColor(R, G, B, 불투명도) : 파라미터 값은 최소 0.0 ~ 1.0 이고 네 번째 파라미터는 불투명도를 나타내는데 이 값이 1.0 이라면 100% 불투명하고 따라서 뒷 배경색이 보이지 않음
2-2) MyDisplay()
- glClear(GL_COLOR_BUFFER_BIT) : 프레임 버퍼를 초기화 하라는 의미 -> 초기화에 사용될 색은 main함수의 glClearColor()에서 설정한 색
- glViewport(x, y, width, height) : 일단 만들어진 윈도우 내에 그림을 그리기 위한 함수로 윈도우와는 다르게 좌하단을 원점으로 함
만약 glViewport(100, 80, 160, 100) 이라면?
- 위 코드에서는 300,300으로 선언하였으므로 윈도우 크기와 동일 -> 윈도우 전체를 하나의 뷰 포트로 취급
- 화면에 보이는 물체는 뷰 포트의 종횡비에 비례하여 축소 또는 확대 된다.
- 종횡비가 1:2로 바뀌면 물체 자체도 위아래로 2배 길이로 늘어나는 왜곡 현상 발생
'기타 > 컴퓨터 그래픽스 & OpenGL' 카테고리의 다른 글
[OpenGL] 마우스 콜백 / 2022.10.23 (0) | 2022.10.23 |
---|---|
[OpenGL] 리셰이프 콜백 / 2022.10.23 (0) | 2022.10.23 |
벡터 그래픽 / 2022.10.22 (0) | 2022.10.22 |
래스터 그래픽 / 2022.10.22 (0) | 2022.10.22 |
컴퓨터 그래픽스 / 2022.10.22 (0) | 2022.10.22 |