PowerPoint 프레젠테이션 - Prof. Kim, Sung-Ho

Download Report

Transcript PowerPoint 프레젠테이션 - Prof. Kim, Sung-Ho

Kim, Sung-Ho
School of Computer, Information and Communication Engineering
Sangji Univ.
1
OpenGL API
학습목표
• API의 정의와 필요성을 이해한다.
• 고수준 API의 장면묘사 방식을 이해한다.
• OpenGL의 설계원리에 반영된 개념을 이해한다.
• OpenGL 프로그램 작성을 위한 유틸리티 프로그램 설치방법을 이해한다.
2
OpenGL 명령어 구조 – pp.143
Vertex 정의
[그림 4-22] 지엘 명령어 구조 I
[표 4-1] 지엘 데이터 타입
float: C/C++ 타입, GLfloat: GL 타입
3
OpenGL 명령어 구조 (계속) – pp.144
Vector Type
[그림 4-23] 지엘 명령어 구조 II
GL은 API
• 명령어가 아니라 함수명. 그러나 혼용
GL은 비 객체지향적
• 처리속도를 향상
• 함수 오버로딩이 불가능
• 3차원 정점이라면 glVertex3f( ), 2차원 정점이라면 glVertex2f( )
4
OpenGL API 프로그램 구성요소
GL: OpenGL Core Library
• Rendering 기능을 제공하는 함수 Library
GLU: OpenGL Utility Library
• 50여 개의 함수. OpenGL Library의 도우미
• 다각형 분할, Projection, 2차원 곡면, Nurbs 등 고급기능을 제공하는 함수
• GL 함수로 작성
GLUT: OpenGL Utility Toolkit
• 사용자 입력을 받아들이거나 화면 윈도우를
제어하기 위한 함수
• 윈도우 운영체제 기능과의 인터페이스
[그림 4-24] GLUT, GL, GLU
5
OpenGL API 프로그램 구성요소(계속) - GLUT
Window 기능: 프로그램 실행에 필요한 창(Window)을 관리
Callback 기능: 프로그램 실행 중 발생하는 사용자 입력을 처리
[그림 4-25] GLUT 기능
[표 4-2] GLUT의 윈도우 기능
6
OpenGL API 설치와 설정 – pp.150-157
설치와 환경 설정
• 1. 게시판에 첨부된 OpenGL API 파일(OpenGL_API.zip)을 다운로드 받는다.
• 2. 임의의 위치(바탕화면 등)에 특정 폴더(예, OpenGL_API)를 생성하고,
OpenGL_API.zip 압축 파일을 푼다.
• 3. 자신의 PC에 설치된 MS Visual Studio의 버전에 맞게 다음과 같이 특정 파일들
을 복사 후 지정한 폴더 위치에 붙여넣기 한다. (※ 'gl' 폴더가 없을 경우 직접 생성
후 사용)
 MS Visual Studio 6.0 (VC98) / 2005 (8) / 2008 (9.0) / 2010 (10.0)
구분
폴더 위치
파일명
헤더 파일(*.h)
C:\Program Files\Microsoft Visual Studio\VC98\include\gl
C:\Program Files\Microsoft Visual Studio 8\VC\include\gl
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\gl
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\gl
gl.h / glu.h
glaux.h / glut.h
라이브러리 파
일(*.lib)
C:\Program Files\Microsoft Visual Studio\VC98\lib
C:\Program Files\Microsoft Visual Studio 8\VC\lib
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib
C:\Program Files\Microsoft Visual Studio 10.0\VC\lib
glu32.lib / glut32.lib
glaux.lib / glut.lib
opengl32.lib
C:\Windows\system32
glut.dll / glut32.dll
opengl32.dll / glu32.
dll
동적 연결
라이브러리
(*.dll)
7
OpenGL API 설치와 설정 (계속) – pp.150-157
설치와 환경 설정 (계속)
• MS Visual Studio .NET
구분
폴더 위치
파일명
헤더 파일(*.h)
C:\Program Files\Microsoft Visual Studio .NET 2003\
VC7\PlatformSDK\include\gl
gl.h / glu.h
glaux.h / glut.h
라이브러리 파
일(*.lib)
C:\Program Files\Microsoft Visual Studio .NET 2003\
VC7\PlatformSDK\lib
glu32.lib / glut32.lib
glaux.lib / glut.lib
opengl32.lib
동적 연결
라이브러리
(*.dll)
C:\Windows\system32
glut.dll / glut32.dll
opengl32.dll / glu32.dll
8
OpenGL API 설치와 설정 (계속) – pp.150-157
설치와 환경 설정 (계속)
• 4. 자신의 PC에 설치된 MS Visual Studio의 버전에 맞게 다음과 같이 프로젝트 설
정에서 라이브러리 파일(*.lib)들을 직접 입력하고, 옵션에서 OpenGL API의 폴더
설정을 필히 추가해야 한다.
 가. MS Visual Studio 6.0
 1) Project -> Setting
– => Setting For : All Configurations 로 변경
– => General : Not Using MFC 확인
– => Link -> Object/library modules : opengl32.lib glut32.lib glu32.lib
glaux.lib 추가 입력
 2) Tools -> Options
– => Directories -> Show directories for: Include files를 선택한 후, 아래
Directories: 부분에 OpenGL API의 헤어 파일(*.h)들이 있는 폴더
C:\Program Files\Microsoft Visual Studio\VC98\include\gl 를 추가 지정
해준다.
– => Directories -> Show directories for: Library files를 선택한 후, 아래
Directories: 부분에 OpenGL API의 라이브러리 파일(*.lib)들이 있는 폴
더 C:\Program Files\Microsoft Visual Studio\VC98\lib 를 추가 지정해준
9
다.
OpenGL API 설치와 설정 (계속) – pp.150-157
설치와 환경 설정 (계속)
• 나. MS Visual Studio 2005 (8) / 2008 (9.0) / 2010 (10.0)
• 1) Project(프로젝트 속성) -> Properties (Property Pages
 => Configuration Properties )(구성 속성) -> Linker(링커) -> Input(입력) ->
Additional Dependencies(추가 종속성) : opengl32.lib glut32.lib glu32.lib
glaux.lib 추가 입력
• 2) Tools (도구)-> Options(옵션)
 => Projects and Solutions (프로젝트 및 솔루션)-> VC++ Directories(VC++ 디렉
터리) -> Show directories for(다음 파일의 디렉터리 표시): Include files(포함 파
일)를 선택, 아래 부분의 “줄 추가” 아이콘을 클릭한 후, OpenGL API의 헤어
파일(*.h)들이 있는 폴더 C:\Program Files\Microsoft Visual Studio
8\VC\include\gl 또는 C:\Program Files\Microsoft Visual Studio 9.0\VC\include\gl
를 추가 지정해준다.
 => Projects and Solutions (프로젝트 및 솔루션)-> VC++ Directories(VC++ 디렉
터리) -> Show directories for (다음 파일의 디렉터리 표시 ): Library files(라이
브러리 파일)를 선택 , 아래 부분의 “줄 추가” 아이콘을 클릭한 한 후, OpenGL
API의 라이브러리 파일(*.lib)들이 있는 폴더 C:\Program Files\Microsoft Visual
Studio 8\VC\lib 또는 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib 를 추
가 지정해준다.
10
오른손 좌표계/왼손 좌표계
오른손 좌표계(OpenGL) / 왼손 좌표계(DirectX)
11
OpenGL 프로그램의 예 – pp.174-176
간단한 OpenGL 프로그래밍
#include <glut.h>
#include <gl.h>
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
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);
glutMainLoop();
return 0;
}
12
정점 배열 – pp.221-225
GLfloat MyVertices[8][3] = {{-0.25, -0.25, 0.25}, {-0.25, 0.25, 0.25}, {0.25, 0.25,
0.25}, {0.25, -0.25, 0.25}, {-0.25, -0.25, -0.25}, {-0.25, 0.25, -0.25}, {0.25, 0.25,
-0.25}, {0.25, -0.25, -0.25}};
GLfloat MyColors[8][3]={{0.2, 0.2, 0.2}, {1.0, 0.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 1.0,
0.0}, {0.0, 0.0, 1.0}, {1.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}};
정점 0, 3, 2, 1으로 구성된 면 (반 시계 방향으로 명시)
• glBegin(GL_POLYGON);
glColor3fv(MyColors[0]); glVertex3fv(MyVertices[0]);
glColor3fv(MyColors[3]); glVertex3fv(MyVertices[3]);
glColor3fv(MyColors[2]); glVertex3fv(MyVertices[2]);
glColor3fv(MyColors[1]); glVertex3fv(MyVertices[1]);
glEnd();
[그림 5-62] 육면체
13
정점 배열 (계속) -계층구조적 표현
[그림 5-64] 물체의 계층적 자료구조
14
정점 배열 (계속)
GLfloat MyVertices[8][3] = {{-0.25,-0.25,0.25}, {-0.25,0.25,0.25}, {0.25,0.25,0.25},
{0.25,-0.25,0.25}, {-0.25,-0.25,-0.25}, {-0.25,0.25,-0.25}, {0.25,0.25,-0.25},
{0.25,-0.25,-0.25}};
GLfloat MyColors[8][3]={{0.2,0.2,0.2}, {1.0,0.0,0.0}, {1.0, 1.0, 0.0}, {0.0,1.0,0.0},
{0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};
GLubyte MyVertexList[24]={0,3,2,1, 2,3,7,6, 0,4,7,3, 1,2,6,5, 4,5,6,7, 0,1,5,4};
void MyDisplay( ){
…
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(3, GL_FLOAT, 0, MyColors);
glVertexPointer(3, GL_FLOAT, 0, MyVertices);
…
for(GLint i = 0; i < 6; i++)
glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE,
&MyVertexList[4*i]);
…
}
15
From Modeling to Rendering
Animation
Object
Modeling
• Wireframe Modeling
• Surface Modeling
• Solid Modeling
Rendering
Movie(Video)
Game
Animation
• Hidden Surface(Line) Removal
• Shading
• Flat(Contant) Shading
• Gouraud Shading
• Phong Shading
• Texture Mapping
16
GLUT Modeling – pp.187-190
정육면체(Cube)
• glutSolidCube(Gldouble size) / glutWireCube(Gldouble size)
원구(Sphere)
• glutSolidSphere(Gldouble radius, Glint slices, Glint stacks)
• glutWireSphere(Gldouble radius, Glint slices, Glint stacks)
원환체(Torus)
• glutSolidTorus(Gldouble innerRadius, Gldouble outerRadius, Glint nsides, Glint rings)
• glutWireTorus(Gldouble innerRadius, Gldouble outerRadius, Glint nsides, Glint rings)
원뿔(Cone)
• glutSolidCone(Gldouble base, Gldouble height, Glint slices, Glint stacks)
• glutWireCone(Gldouble base, Gldouble height, Glint slices, Glint stacks)
정사면체(Tetrahedron)
• glutSolidTetrahedron(void) / glutWireTetrahedron(void
정20면체(Lcosahedron)
• glutSolidlcosahedron(void) / glutWirelcosahedron(void)
차 주전자(Teapot)
• glutSolidTeapot (Gldouble size) / glutWireTeapot (Gldouble size)
17
Callback Programming – pp.176-177, pp.191-215
[표 5-1] 타입별 콜백함수
[그림 5-19] 콜백 테이블
18
Callback Programming (계속)
Reshape
• glutReshapeFunc(void(*func)(int width, int height))
Keyboard
• glutKeyboardFunc(void(*func)(unsigned char key, int x, int y))
• glutSpecialFunc(void(*func)(int key, int x, int y))
Mouse
• glutMouseFunc(void(*func)(int button, int state, int x, int y))
• glutMotionFunc(void(*func)(int x, int y))
• glutPassiveMotionFunc(void(*func)(int x, int y))
Menu
• glutCreateMenu(void(*func)(int value))
• glutSetMenu(int id)
• glutAddMenuEntry(char *name, int value)
• glutAttachMenu(int button)
• glutAddSubMenu(char *name, int menu)
Idle
• glutIdleFunc(void)
Timer
• glutTimerFunc(unsigned int msecs, void(*func)(int value), int value)
19
Callback Programming (계속)-pp.217-220
Idle
• Double Buffering
•애니메이션 시의 문제
•화면의 깜빡 거림(Flickering) 현상
•프레임 버퍼의 기록 속도와 검색 속도와의 차이 때문에 발생
[그림 5-60] 프레임 버퍼 쓰기와 읽기
20
Callback Programming (계속)
Idle (con’t)
•Double Buffering
•Front Buffer와 Back Buffer
•void glutInitDisplayMode(unsigned int mode)
•glutInitDisplayMode(GLUT_SINGLE)
•glutInitDisplayMode(GLUT_DOUBLE)
•void glutSwapBuffers(void)
•Front Buffer와 Back Buffer를 Switching 하기 위한 것
[그림 5-61] 더블 버퍼링(Double Buffering)
21