본문 바로가기

기타/컴퓨터 그래픽스 & OpenGL

[OpenGL] 백색 사각형 그리기 / 2022.10.22

* 출처 : 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)에 위치시키면 ?

(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) 이라면?

glViewport(100, 80, 160, 100)

- 위 코드에서는 300,300으로 선언하였으므로 윈도우 크기와 동일 -> 윈도우 전체를 하나의 뷰 포트로 취급

- 화면에 보이는 물체는 뷰 포트의 종횡비에 비례하여 축소 또는 확대 된다.

 

뷰 포트 (300, 300)
뷰 포트 (150, 300)

 

- 종횡비가 1:2로 바뀌면 물체 자체도 위아래로 2배 길이로 늘어나는 왜곡 현상 발생