opengl 이란
DESCRIPTION
OpenGL 이란. 그래픽스 하드웨어에 대한 소프트웨어 인터페이스 OpenGL 의 전신은 실리콘그래픽스사의 IRIS GL IRIS 그래픽스 전용 워크스테이션에서 사용하는 3D 프로그래밍 API 이 하드웨어는 행렬변환을 초고속으로 수행할 수 있고 depth 버퍼링을 하드웨어로 지원 OpenGL 은 IRIS GL 을 다른 하드웨어 플랫폼으로 이식할 때 생기는 여러 문제를 해결해서 이식성을 높이기 위해 SGI 에서 제작된 개방형 (Open) API OpenGL 의 작동 방식 - PowerPoint PPT PresentationTRANSCRIPT
OpenGL OpenGL 이란이란그래픽스 하드웨어에 대한 소프트웨어 인터페이스OpenGL 의 전신은 실리콘그래픽스사의 IRIS GL
◦ IRIS 그래픽스 전용 워크스테이션에서 사용하는 3D 프로그래밍 API
◦ 이 하드웨어는 행렬변환을 초고속으로 수행할 수 있고 depth 버퍼링을 하드웨어로 지원
OpenGL 은 IRIS GL 을 다른 하드웨어 플랫폼으로 이식할 때 생기는 여러 문제를 해결해서 이식성을 높이기 위해 SGI 에서 제작된 개방형(Open) API
OpenGL 의 작동 방식◦ OpenGL API 를 이용한 함수 호출로 구성되며 200 개
이상의 명령과 함수들로 구성 . ◦ Lighting, Shading, Texture mapping, Blending,
Transparency, Animation 등 특수 효과 포함
2012-2 학기 Chapter 1 OpenGL 소개 1
OpenGL 은 윈도우 관리나 파일 입출력 , 사용자와의 상호작용에 관련된 기능은 지원하지 않는다 .
출력값을 스크린을 통해 나타내기 위해서는 GDI(Graphics Device Interface) 라는 Windows API 호출 .◦GDI 는 윈도우에서 텍스트를 쓰거나
간단한 2D 라인을 그릴 수 있는 메소드를 가진다 ( 그림 ).
2012-2 학기 Chapter 1 OpenGL 소개 2
일반 어플리케이션에서 일반 어플리케이션에서 OpenGLOpenGL 의 위치의 위치
2012-2 학기 Chapter 1 OpenGL 소개 3
어플리케이션 프로그램
OS서비스
I/O 서비스 GDI OpenGL
소프트웨어래스터라이저
디스플레이 /윈도우시스템
라이브러리와 헤더파일라이브러리와 헤더파일Microsoft Windows 에는 소프트웨어
렌더링을 사용하는 OpenGL 이 포함되어 있다 .
Windows 시스템 디렉토리에 있는 opengl32.dll 로 OpenGL 이 구현되어 있음 .◦Windows 98: C:\Windows\System◦Windows 2000, XP: C:\WINNT\System32
C:\Windows\System32OpenGL 유틸리티 (glu32.dll)
◦특수 행렬 연산과 같이 자주 수행되거나 복잡한 작업을 수행하는 함수들로 구성
◦곡선이나 곡면 등의 그리기를 지원
2012-2 학기 Chapter 1 OpenGL 소개 4
모든 OpenGL 함수의 프로토타입과 자료형 , 매크로 등은 gl.h 라는 헤더 파일에 있다 . 유틸리티 라이브러리는 glu.h 라는 파일에 있다 . ◦ #include <windows.h>◦ #include <gl\gl.h>◦ #include <gl\glu.h>
GLUT 라이브러리 설치 : glut32.dll 과 glut32.lib
GLUT 헤더 파일 설치 : glut.h◦ C:\Windows\system32 <= glut32.dll◦ C:\Program Files\Microsoft Visual Studio\VC98\lib <= glut32.lib◦ C:\Program Files\Microsoft Visual Studio\VC98\
Include\GL <= glut.h
2012-2 학기 Chapter 1 OpenGL 소개 5
2012-2 학기 Chapter 1 OpenGL 소개 6
11 장 장 OpenGL OpenGL 의 소개의 소개
OpenGL 이란 무엇인가
OpenGL 코드 구조
OpenGL 커맨드 문법
상태기계로 본 OpenGL
OpenGL 렌더링 파이프라인
OpenGL 관련 라이브러리
애니메이션
예제 소스 프로그램 예제 소스 프로그램
ftp://ftp.sgi.com/opengl/opengl14.zip
GLUT 소스 코드나 최신 버전의 프로그램 및 예제◦http://www.opengl.org/resources/libr
aries/glut/
2012-2 학기 Chapter 1 OpenGL 소개 7
OpenGL OpenGL 이란 무엇인가이란 무엇인가
OpenGL 은 그래픽스 하드웨어에 대한 소프트웨어 인터페이스
대화형 3 차원 응용프로그램제작에 필요한 객체를 구성하거나
연산을 수행하기 위한 250 여개의 커맨드로 구성 .
3 차원객체 모델을 표현하기위한 하이레벨 커멘드를 제공하지는
않고
오직 점 , 선 , 폴리곤 등과 같은 기하 프리미티브만 사용하여 표현
GLU(OpenGL Utility Library) 와 같이 OpenGL 상에서 동작하는
하이레벨의 라이브러리를 만들 수 있다 .
2012-2 학기 Chapter 1 OpenGL 소개 8
OpenGL OpenGL 에서 수행하는 연산에서 수행하는 연산기하 프리미티브로부터 도형을 만든다 .
프리미티브에는 점 , 선 , 폴리곤 , 이미지 , 비트맵 등이 있다 .
구성한 오브젝트들을 3 차원 공간에 놓은 다음 , 이를 바라볼 시점을 선택
모든 오브젝트에 대한 컬러를 계산한다 . 라이팅 조건 및 텍스춰매핑 수행
오브젝트의 수학적 표현과 컬러 정보를 스크린상의 픽셀로 변환 . 이 과정을 래스터화 (Rasterization) 라고 부른다 .
2012-2 학기 Chapter 1 OpenGL 소개 9
OpenGL OpenGL 코드 구조코드 구조 #include <whateverYouNeed.h>
main(){
InitializeAWindowPlease();
glClearColor(0.0, 0.0, 0.0, 0.0); /* 윈도우 클리어 결정 (지정색 )*/
glClear(GL_COLOR_BUFFER_BIT); /* 해당 윈도우를 실제로 클리어 */
glColor3f(1.0, 1.0, 1.0); /* 오브젝트를 그릴 때 사용할 컬러지정( 흰색 ) */
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
/* 최종 이미지를 스크린에 매핑할 때 사용할 좌표계 지정 */
glBegin(GL_POLYGON);
/* 오브젝트를 정의하는 코드 glBegin 에서 glEnd까지 */
glVertex3f(0.25,0.25, 0.0); /* 각 꼭지점 지정 (x,y,z)*/
glVertext3f(0.75,0.25,0.0);
2012-2 학기 Chapter 1 OpenGL 소개 10
glVertext3f(0.75,0.75,0.0);
glVertext3f(0.25,0.75,0.0);
glEnd();
glFlush();
/* 그동안 버퍼 (buffer) 에 저장된 드로잉 커맨드들이 실제로 실행 */
UpdateTheWindowAndCheckforEvnets();
/* 윈도우 내용을 관리 , 이벤트 처리하는 코드가 들어갈 자리 */
}
2012-2 학기 Chapter 1 OpenGL 소개 11
2012-2 학기 Chapter 1 OpenGL 소개 12
OpenGL OpenGL 커맨드 문법커맨드 문법 모든 OpenGL 커맨드 앞에는 gl 이라는 접두사가 붙음 상수들은 “ GL_” 로 시작 . 커맨드 접미사 - glColor3f() : f 는 부동 소수점을 의미 , 3 은 함수 인자가
3 개접미사 데이터 타입 C 언어 타입 OpenGL 타입정의
b 8 비트 integer signed char GLlbyte
s 16 비트 integer Short GLshort
i 32 비트 integer int 또는 long GLint, GLsizei
f 32 비트 floating-point Float GLfloat, GLclampf
d 64 비트 floating-point double GLdouble, GLclampd
ub 8 비트 unsigned integer unsigned char GLbyte, GLboolean
us 16 비트 unsigned integer unsigned short GLushort
ui 32 비트 unsigned integer unsigned int 또는unsigned long
GLuint, GLenum, GLbitfield
접미사에 v 는 여러 개의 인자를 하나의 벡터 ( 또는 배열 ) 에 담아서 여기에 대한 표인터를 커맨드에 전달한다는 것을 의미
glColor3f(1.0, 0.0, 0.0);GLfloat color_array[] = {1.0, 0.0, 0.0} ;glColor3fv(color_array);
2012-2 학기 Chapter 1 OpenGL 소개 13
상태 기계로 본 상태 기계로 본 OpenGLOpenGL
OpenGL 은 일종의 상태기계◦ 특정한 상태나 모드로 설정해두면 이를 변경할 때까지
그 상태로 남아 있음 .
현재 컬러를 흰색으로 설정하였다면 이 값이 변하지 않는 한 모든 오브젝트들은 흰색 으로 그려짐 .
컬러 , 뷰 설정 , 투영 변환 , 선 폴리곤 패턴 , 폴리곤 드로잉 모드 , 빛 위치 , 재질 속성 등 제어
대다수의 상태 변수들은 glEnable() 및 glDisable() 커맨드를 통해 켜거나 끌 수 있음 .
2012-2 학기 Chapter 1 OpenGL 소개 14
OpenGL OpenGL 렌더링 파이프라인렌더링 파이프라인대다수의 OpenGL 구현들은 OpenGL 렌더링
파이프라인 구조를 가짐
정점 , 선 , 폴리곤 등과 같은 기하 데이터는 평가자 (evaluator) 와 per-vertex 연산을 거침
픽셀 , 이미지 , 비트맵 등과 같은 픽셀 데이터 들은 이와 다른 경로를 거침
마지막단계 ( 래스터화 ) 에서는 만나며 , 최종적으로 생성된 필셀 데이터는 프레임버퍼에 기록 .
2012-2 학기 Chapter 1 OpenGL 소개 15
OpenGL OpenGL 렌더링 파이프라인렌더링 파이프라인
2012-2 학기 Chapter 1 OpenGL 소개 16
연산 순서
FameBuffer
Display list
Pixel Operations Evaluators
Resterization
Per-fragment operations
Texture assembly
PixelData
VertexData
Per-vertex Operations and
Primitive assembly
OpenGL OpenGL 렌더링 파이프라인의 렌더링 파이프라인의 각 단계각 단계 디스플레이 리스트
◦ 기하학적인 정보를 나타내는 데이터든 , 픽셀을 나타내는 데이터든 상관없이 디스플레이 리스트에 저장해 둘 수 있다 .
평가자 : 제어점으로부터 정점을 구함 , 표면 법선 , 텍스처좌표 , 컬러 , 공간좌표를 얻음
Per-vertex ( 정점연산 ): 평가자 단계를 거친 후 정점들을 4x4 부동소수점 행렬로 변환 . 공간 좌표들은 스크린상의 한 점으로 투영됨 .
프리미티브 조립 (primitive assembly)◦ 프리미티브 조립 단계의 주된 부분은 클리핑 .
2012-2 학기 Chapter 1 OpenGL 소개 17
픽셀 연산 (Pixels operation)
◦ 메모리상 배열에 다양한 포맷으로 저장되어 있는 픽셀들을 먼저 풀고 적절한 수의 컴포넌트에 넣음
◦ 이러한 데이터들에 대해 스케일 (scale), 편중 (bias) 등의 연산을 수행 , 픽셀 맵에 따라 처리 .
◦ 그 다음 결과를 고정시키고 , 이를 텍스쳐 메모리에 쓰거나 래스터화 단계로 보냄 .
텍스처 조립 (Texture assembly)
◦ 좀더 현실감 있는 표현을 위해 기하 오브젝트에 텍스처 이미지를 붙일 수 있는 기능을 제공 .
2012-2 학기 Chapter 1 OpenGL 소개 18
래스터화 (rasterization)
◦ 이 단계에서는 기하 데이터와 픽셀 데이터를 모두 프레그먼트 (fragment) 들로 변환 .
◦ 각각의 프래그먼트들은 사각형으로 되어 있고 프레임버퍼의 한 픽셀에 대응
프레그먼트 연산
◦ 값들이 실제로 프레임 버퍼에 저장되기 전에 , 일련의 연산을 수행하여 특정한 프레그먼트들을 변경하거나 제거 .
◦ 텍스처링 , 안개효과 , 블렌딩 , 디더링 , 논리연산 등의 추가 연산 수행
2012-2 학기 Chapter 1 OpenGL 소개 19
OpenGLOpenGL 관련 라이브러리관련 라이브러리 OpenGL 에서는 강력한 렌더링 커맨드 들을 제공하고 있지만 ,
모두 기본적인 기능만 갖고 있기 때문에 하이레벨의 그림을 그릴 때에는 이들 커맨드로만 작업해야 하는 번거로움이 있다 . 이와 같은 불편을 줄이기 위해 다음과 같은 라이브러리가 제공 .
◦ OpenGL 유틸리티 라이브러리 (GLU, OpenGL Utility Library): 로우 레벨의 OpenGL 커맨드들을 사용하여 뷰잉이나
투영을 위한 행렬 설정 , 폴리곤 테셀레이션 (tessellation), 표면렌더링 등과 같은 작업들을 수행하는 루틴들로 구성
OpenGL Reference Manual 에서 설명 GLU 루틴 앞에 glu 접두사가 붙음 .
◦ 렌더링을 지원하기 위해 기존 윈도우 시스템의 기능을 확장시켜주는 라이브러리 X Window System 의 경우 :
GLX (OpenGL Extension to the X Window System) 라이브러리 제공
glx 접두사가 붙음
2012-2 학기 Chapter 1 OpenGL 소개 20
MS window 95/98/NT : WGL 라이브러리 ( 접두사 wgl),
IBM OS/2 : PGL(Presentation Manager to OpenGL interface), pgl
접두사 붙음 Apple :
AGL 라이브러리 ( 접두사 agl)
◦ OpenGL 유틸리티 툴킷 (GLUT) 윈도우 시스템에 독립적인 툴킷으로 다양한 윈도우 시스템
API 들 간의 차이점들을 추상화 . GLUT 루틴 앞에 glut 접두사가 붙음 .
◦ 파렌하이트 씬 그래프 (FSG) OpenGL 에 기반한 객체 지향 툴킷으로 대화형 3 차원 그래픽
응용프로그램을 제작하기 위한 객체와 메소드들을 제공
2012-2 학기 Chapter 1 OpenGL 소개 21
Include 파일
◦ OpenGL 응용프로그램을 구성하는 거의 대부분이 모든 파일에 gl.h 헤더파일추가 .
◦ 대부분의 응용프로그램들이 GLU 를 사용하기 때문에 glu.h 라는 헤더 파일도 추가 .
#include <GL/gl.h> #include <GL/glu.h>
◦ MS Windows 에서는 MS Windows 버전의 gl.h 와 glu.h 에서 내부적으로 사용하는 일부 메크로들이 windows.h 라는 파일에 정의 , windows.h 추가 문장은 gl.h 나 glu.h 보다 먼저 작성 .
2012-2 학기 Chapter 1 OpenGL 소개 22
GLX 루틴에 접근하려면◦ #include < X11/Xlib.h>◦ #include < GL/glx.h>
MS Windows 에서 WGL 루틴에 접근하려면◦ #include <windows.h>
윈도우 관리 태스크를 관리하기 위해 GLUT 를 사용하려면◦ #include <GL/glut.h>
표준 C 라이브러리 시스템 콜 사용 시◦ #include <stdlib.h>◦ #include <stdio.h>
2012-2 학기 Chapter 1 OpenGL 소개 23
GLUT GLUT –– OpenGL OpenGL 유틸리티 툴킷유틸리티 툴킷
렌더링 커맨드는 윈도우 시스템이나 운영체제와는 독립적으로 설계
마우스로부터 발생한 이벤트를 인식하기 위한 커맨드들은 OpenGL 에 포함되어 있지 않다 .
사용자 입력이나 윈도우 처리를 위해 GLUT 사용
윈도우 관리
◦ 윈도우를 초기화 하기 위해서는 다섯 개의 루틴이 필요
◦ glutInit(int *argc, char **argv) GLUT 를 초기화하고 커맨드 라인 인자로 주어진 것들을 처리
2012-2 학기 Chapter 1 OpenGL 소개 24
◦ glutInitDisplayMode(unsigned int mode) 컬러 모델로 RGBA 나 컬러 인덱스 모드를 사용할지 여부를
지정
◦ glutInitWindowPosition(int x, int y) 스크린에서 윈도우의 좌측 상단 모서리에 해당하는 위치를 지정
◦ glutInitWindowSize(int width, int size) 윈도우의 크기를 픽셀 단위로 지정 .
◦ int glutCreateWindow(char *string) OpenGL 컨텍스트를 가진 윈도우를 생성 . 윈도우에 대한
고유 식별 번호를 반환한다 . glutMainLoop() 호출 전까지는 생성된 윈도우가 화면에
나타나지 않음
2012-2 학기 Chapter 1 OpenGL 소개 25
디스플레이 콜백◦glutDisplayFunc(void (*func)(void))
장면을 다시 그리는 데 필요한 루틴들은 모두 이러한 디스플레이 콜백 함수에 포함되어 있어야 한다 .
프로그램 실행하기◦마지막으로 해야 할 일은
glutMainLoop(void) 를 호출하는 것 . 이 루틴을 호출하면 지금까지 생성한 윈도우들과 여기에 그린 그림들이 비로소 화면에 나타나게 된다 .
2012-2 학기 Chapter 1 OpenGL 소개 26
GLUTGLUT 를 사용한 간단한 를 사용한 간단한 OpenGL OpenGL 프로그램프로그램 #include <GL/glut.h>
#include <stdlib.h>
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT); /* 모든 픽셀을 지운다 */
/* (0.25, 0.25, 0.0) 과 (0.75, 0.75, 0.0) 에 모서리를 둔 흰색 폴리곤을 그린다 */
glColor3f (1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
2012-2 학기 Chapter 1 OpenGL 소개 27
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();
glFlush (); /* 기다리지 않고 , 버퍼에 저장된 OpenGL 루틴을 실행한다 . */
}
void init (void) {
glClearColor (0.0, 0.0, 0.0, 0.0); /* 클리어 컬러를 선택한다 */
glMatrixMode(GL_PROJECTION); /* 뷰잉값을 초기화 한다 */
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
2012-2 학기 Chapter 1 OpenGL 소개 28
/* 초기 윈도우의 크기와 위치 , 디스플레이 모드 ( 싱글버퍼와 RGBA 모드 ) 를 설정한다 .
* 그리고 타이틀바에 “ hello” 가 출력되는 윈도우를 연다 . 초기화 루틴들을 실행시킨다
* 그래픽을 출력하도록 콜백 함수를 등록한다 .
*마지막으로 , 메인 루프를 실행하고 이벤트를 처리한다 . */
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
2012-2 학기 Chapter 1 OpenGL 소개 29
입력 이벤트 처리
◦ 지정한 이벤트가 발생할 때 호출될 콜백 커멘드를 등록하기 위해서는 다음과 같은 루틴을 사용
glutReshapeFunc(void (*func)(int w, int h)) 윈도우 크기가 변경될 때 취할 동작지정
glutKeyboardFunc(void (*func)(unsigned char key, int x, int y)) 키 누를 때 루틴이 호출되도록 키보드 버튼과 루틴을 연결
glutMouseFunc(void (*func)(int button, int state, int x, int y)) 마우스 버튼을 누를 때 해당 루틴이 호출되도록 버튼과 연결
glutMotionFunc(void (*func)(int button, int state, int x, int y)) 마우스 버튼을 누른 채 마우스를 움직일 때 호출될 콜백 함수 등록
2012-2 학기 Chapter 1 OpenGL 소개 30
백그라운드 프로세스 관리
◦처리해야 할 이벤트가 없을 때 , 즉 이벤트 루프가 유휴 상태에 있을 때 실행될 함수를 glutIdleFunc(void (*func)(void)) 로 지정 .
◦인자로 함수에 대한 포인터만 받는다 .
2012-2 학기 Chapter 1 OpenGL 소개 31
33 차원 오브젝트 그리기차원 오브젝트 그리기◦GLUT 에서는 다음과 같은 3 차원
오브젝트를 그리기 위한 루틴 제공
2012-2 학기 Chapter 1 OpenGL 소개 32
원뿔 (cone) 20 면체(icosahedron)
주전자 (teapot)
정육면체 (cube) 8 면체 (octahedron) 사면체 (tetrahedron)
12 면체(dodecahedron)
구 (sphere) 토러스 (torus)
이러한 오브젝트들은 와이어프레임 방식으로 그리거나 , 표면 법선을 정의하여 솔리드 쉐이딩된 형태로 그릴 수 있다 . 정육면체와 구를 그리기 위한 루틴들로 다음과 같은 것들이 제공
◦ void glutWireCube(GLdouble size);◦ void glutSolidCube(GLdouble size);◦ void glutWireSphere(GLdouble radius, GLint
slices, GLint stacks);◦ void glutSolidSphere(GLdouble radius, GLint
slices, GLint stacks);
GLUT 참고◦ http://www.opengl.org/resources/libraries/glut/spec
3/spec3.html
2012-2 학기 Chapter 1 OpenGL 소개 33
애니메이션애니메이션 애니메이션 원리
open_window(); for (i = 0; i < 1000000; i++) {
clear_the_window(); draw_frame(I); wait_until_a_24th_of_a_second_is_over();
}
더블버퍼링을 사용한 부드러운 애니메이션 open_window_in_double_buffer_mode(); for (i = 0; i < 1000000; i++) {
clear_the_window(); draw_frame(i); swap_the_buffers();
}
2012-2 학기 Chapter 1 OpenGL 소개 34
불규칙 적인 리프레쉬
◦장면의 복잡도가 프레임 비율에 가까울 경우(1/60 초 2/60 초 , 3/60 초 ) 어떤 프레임은 이 시간을 초과하고 다른 것은 간신히 이 시간 내에 그려지기 때문에 비율이 일정하지 않게 되어 시각적으로 보기 좋지 않다 . 이와 같은 경우 모든 프레임을 빠르게 처리할 수 있도록 장면을 간소화 할 수 없다면 처리 시간에 약간의 딜레이를 추가하여 느리지만 일정한 프레임 비율을 갖도록 하는 것이 좋다 .
2012-2 학기 Chapter 1 OpenGL 소개 35
움직임 = 다시 그리기 + 교체◦ 에니메이션에서 오브젝트들은 단순히 변환만 달라짐 . ◦ 뷰어의 시점이 달라지거나 , 자동차가 길을 따라 좀더 움직이거나 , 오브젝트가 약간 회전하기만 하는 경우가 많음 .
◦ 드로잉에 관련 없는 연산에 대해 계산해야 할 것이 많아지면 프레임비율이 떨어짐 .
◦ Swap_the_buffer() 루틴 뒤에 나오는 유휴시간이 이러한 계산을 위해 사용될 수 있다 .
X Window System ◦ void glxSwapBuffers(Displays *dpy, Window
window);
GLUT 라이브러리를 사용할 경우◦ void glutSwapBuffers(void);
2012-2 학기 Chapter 1 OpenGL 소개 36
더블버퍼링을 사용한 더블버퍼링을 사용한 프로그램프로그램 glutSwapBuffers() 를 사용하는 방법을 보여주고 있
다 . 마우스 버튼을 이용하여 회전을 켜고 끄도록 하였다 .
#include <GL/glut.h>
#include <stdlib.h>
static GLfloat spin = 0.0;
void init(void) {
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
2012-2 학기 Chapter 1 OpenGL 소개 37
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix();
glutSwapBuffers();
}
2012-2 학기 Chapter 1 OpenGL 소개 38
void spinDisplay(void) {
spin = spin + 2.0;
if (spin > 360.0)
spin = spin - 360.0;
glutPostRedisplay();
}
void reshape(int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
2012-2 학기 Chapter 1 OpenGL 소개 39
void mouse(int button, int state, int x, int y) {
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
2012-2 학기 Chapter 1 OpenGL 소개 40
/* 더블 버퍼 디스플레이 모드를 요청하고 , 마우스 입력 콜백 함수를 등록 */
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
2012-2 학기 Chapter 1 OpenGL 소개 41
소스파일 실행 ( 마우스 동작 실행 전 )
◦흰색 사각형이 회전하지 않는다 .
소스파일 실행◦왼쪽 마우스 클릭으로 회전◦오른쪽 마우스 클릭으로 중단
2012-2 학기 Chapter 1 OpenGL 소개 42