Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램

Similar presentations


Presentation on theme: "제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램"— Presentation transcript:

1 제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램
Lecture #4 제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램

2 강의 개요 OpenGL API 함수 소개 2차원 프로그램 예 #3 : 시어핀스키 가스켓

3 OpenGL API 함수의 그룹 기본 요소 함수 : 속성 함수 : 관측함수 : 변환 함수 : 입력 함수 : 제어 함수 :
점, 선분, 다각형, 문자열 등 속성 함수 : 색, 선의 두께, 글자체 등 관측함수 : 합성 카메라 설정 변환 함수 : 회전, 이동, 크기 변환 등 객체 변환 입력 함수 : 키보드, 마우스 등의 입력 처리 제어 함수 : 윈도우 시스템과의 통신, 초기화, 에러 처리 등

4 기본 요소와 속성 기본 요소에 대한 논쟁 OpenGL 최소주의 최대주의 중간적인 입장
점, 선, 다각형, 문자열 등 최소한의 요소 만 지원 이식성 우수 – 모든 하드웨어에 의해 지원 최대주의 원, 곡선, 곡면, 입체 등의 다양한 요소 지원 사용자가 보다 복잡한 응용을 개발할 수 있도록 이식성이 약함 OpenGL 중간적인 입장 GL : 작은 기본 요소 집합 GLU : GL로부터 유도된 풍부한 객체 제공

5 기본 요소 (1) OpenGL 기본 요소 glBegin(type); glVertex*( . . .); : glEnd();
삼차원 객체를 정점들의 집합으로 표현 type : 정점들의 해석 방법을 정의 glBegin(type); glVertex*( . . .); : glEnd();

6 기본 요소 (2) OpenGL에서 정점의 표현 glVertex*() 예) * = nt 또는 ntv 형태 n : 차원
t : 데이터 형 ( 정수 : I, 실수 : f, double : d ) v: 배열에 대한 포인터 예) glVertex2i(GLint xi, GLint yi) glVertex3f(GLfloat x, GLfloat y, GLfloat z) GLfloat vertex[3]; glVertex3fv(vertex)

7 기본 요소 (3) 점형 & 선분형

8 다각형의 기초 다각형 닫혀있고 내부를 가진 객체 여러 가지 표시 방법 채워진 객체 다각형 표시 방법

9 단순 다각형 단순 다각형 두 변이 교차하지 않음 명확하게 정의된 내부를 가짐

10 다각형 채우기 알고리즘 다각형 채우기 알고리즘 한 점이 다각형의 내부에 있는 지를 검사하는 방법
다각형의 각 내부 점들에 원하는 색을 지정하는 내부점 처리에 기초 한 점이 다각형의 내부에 있는 지를 검사하는 방법 교차 검사(crossing test) / 홀수-짝수 검사(odd-even test) pp 50, 그림 2.12 감기 검사(winding test) pp 51, 그림 2.13

11 볼록 다각형 볼록 객체(convex object) 객체 내부 임의의 두 점 사이의 선분 위의 모든 점이 객체 내부에 존재
예) 삼각형, 사면체, 사각형, 원, 구, 평행 육면체

12 3차원 모델링과 삼각형 전형적인 렌더링 알고리즘 3차원 볼록 검사 정점들이 평평한 볼록 다각형이어야 올바르게 작동
검사가 쉽지 않음 : 다각형이 평평하지 않을 수 있다 세 정점은 항상 평평한 볼록 삼각형을 정의  보통 삼각형을 사용하여 3차원 객체를 모델링

13 OpenGL에서 다각형 형(1) 다각형 : GL_POLYGON (볼록 다각형만 지원)
삼각형과 사변형 : GL_TRIANGLES, GL_QUADS 다각형보다 효율적인 렌더링

14 OpenGL에서 다각형 형(2) 띠와 부채꼴(strips and fans)
GL_TRIANGLE_STRIP, GL_QUAD_STRIP GL_TRIANGLE_FAN

15 문자열 (1) 종류 획(stroke) 문자열 (벡터 문자열) 획(stroke) 문자열 : Vector Font
래스터 문자열 : Bitmap Font 획(stroke) 문자열 (벡터 문자열) 선분과 곡선으로 문자 윤곽을 정의 확대 또는 회전시켰을 때 문자의 세밀함과 모양이 유지됨

16 문자열 (2) 래스터 문자열 단순하고 빠름 비트맵으로 정의됨 확대하면 거친 모양이 됨

17 곡선 객체 곡선/곡면과 같은 객체를 생성하기 위한 접근 방법 근사 방법 : 기본 요소들을 사용해서 근사 수학적 접근 방법
원 : n개의 변을 가진 정다각형 수학적 접근 방법 곡선 : 다항식을 이용하여 정의

18 속 성(Attributes) (1) 속성 즉시 모드(Immediate Mode) 객체가 어떻게 표현되는가를 정의
속성은 시스템 상태의 일부 한번 설정되면 변경되기 전까지 계속해서 유지된다 즉시 모드(Immediate Mode) 객체가 정의될 때 현재의 속성 값에 따라 화면에 즉시 디스플레이 되는 모드 화면에 출력된 객체에 대한 정보를 저장해두지 않는다

19 속 성(Attributes) (2) 각 기하학적 형은 해당 속성 집합을 가진다 점 : 색, 크기
선분 : 색, 두께, 종류(실선, 단선, 점선) 다각형 : 채우기 방법 획 문자열 : 높이, 너비, 서체, 종류

20 색(Color) 물리학적 관점에서의 색 해당 파장의 세기를 나타내는 함수 C()로 표현
 시각 체계가 삼원색 모형과 일치하므로 3 색 정합만 고려

21 삼색이론(Three-Color Theory)
세가지 추상체는 색 분포 C()에 노출될 때 각자의 감도 분포 S()와 C()의 곱의 적분값 AR, AG, AB를 구하여 뇌에 전달 뇌는 연속 분포 C()가 아닌 (AR, AG, AB)를 통하여 색을 인지 삼색 이론의 기본 원리 : 두 색이 동일한 3 자극값을 생성한다면 그것은 시각적으로 구별할 수 없다 (C()가 서로 다를지라도)

22 사람의 색 인식 대상의 색분포 : 적색, 녹색, 청색 센서의 감도함수 : 적색, 녹색, 청색 센서의 출력 휘도 감지된 색

23 색의 생성 (1) 가산적 색 모형 검은색에 원색들이 더해져 색을 만듦 예) CRT 및 Slide film
R, G, B 성분으로 표시: C = T1R + T2G + T3B (T1, T2 ,T3 는 세가지 색의 강도)

24 색의 생성 (2) 감산적 색 모형 흰색에서 원색을 뺌으로써 색을 만듦 종이에 인쇄하는 경우에 적합
물감은 표면에 비추는 빛으로부터 색소를 제거 원색 : 청록색(cyan), 자홍색(magenta), 황색(yellow) 가산적 색 모형과 서로 상대(dual) 관계가 있음 1) 

25 색 입체

26 RGB 색 색 모형 RGB 색 모형 프레임 버퍼의 값이 R, G, B 각 성분 값을 나타냄
많은 메모리 필요 (예 : 1280 X 1024 X 24bit = 3.75MB)

27 색인 색 모형(indexed color model)
프레임 버퍼의 값이 색 참조표의 색인 값을 나타냄

28 OpenGL에서 색 요소 표시 색 요소 표시 4 색 체계 (RGBA)
특정 하드웨어에 독립적이기 위해 0.0 에서 1.0 사이의 값으로 표시 예) glColor3f(1.0, 0.0, 0.0); /* R, G, B 순서 */ 4 색 체계 (RGBA) A = 알파 채널(alpha channel) 0.0 : 완전 투명 ~ : 완전 불투명 안개 효과, 이미지 결합 등에 사용 예) 윈도우를 흰색으로 지우기 glClearColor(1.0, 1.0, 1.0, 1.0); glClear();

29 관측(Viewing) 2차원 관측 이차원 세계에서 사각 영역을 취하고 그것의 내용을 화면의 정해진 영역으로 옮기는 것
사각 영역 = 관측 사각형 = 절단 사각형

30 2차원 관측 3차원 그래픽스의 특수한 경우 관측 사각형이 3차원 관측 공간(viewing volume) 내에서 z = 0 인 평면 내에 있음 기본 관측 공간 : 중심에 원점을 가진 2 X 2 X 2 입방체 관측사각형

31 직교 투영(Orthogonal Projection)
2차원 관측은 직교 투영의 특수한 경우 점 (x,y,z)를 점 (x,y,0)으로 투영 OpenGL에서 직교 투영의 명시 void glOrtho(left, right, bottom, top, near, far) /* 모두 GLdouble 형 */ void gluOrtho2D(left, right, bottom, top) /* near = -1.0, far = 1.0 */

32 행렬 모드 그래픽스 파이프라인의 행렬 각 행렬은 단위 행렬에서 시작하여 일련의 변환 행렬을 곱하여 갱신 행렬 모드
모델-관측 행렬 투영 행렬 각 행렬은 단위 행렬에서 시작하여 일련의 변환 행렬을 곱하여 갱신 행렬 모드 현재 갱신하는 행렬을 지정 디폴트 모드 : 모델-관측 행렬 모드

33 이차원 관측 사각형 설정 glMatrixMode(GL_PROJECTION); glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0); glMatrixMode(GL_MODELVIEW);  좌하단 구석이 이차원계의 원점인 500 X 500 관측 사각형을 정의

34 제어 함수 윈도우 시스템과의 상호 작용 초기화 : glutInit(int *argcp, char **argv)
윈도우 생성 : glutCreateWindow(char *name) 기본 특성 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); GLUT_RGB : RGB 색 모델 (cf. GLUT_INDEX) GLUT_DEPTH : 은면 제거 GLUT_DOUBLE : 더블 버퍼링 (cf. GLUT_SINGLE) glutInitWindowSize(480, 640); /* 윈도우 크기 */ glutInitWindowPosition(0,0); /* 윈도우 위치 */ 좌상단이 (0,0)

35 종횡비와 시역(1) 종횡비(aspect ratio) 높이에 대한 너비의 비율
관측 사각형의 종횡비와 윈도우의 종횡비가 같지 않으면 왜곡 현상

36 종횡비와 시역(2) 시역(Viewport) 디스플레이 윈도우 내의 사각형 영역 디폴트로 전체 윈도우 시역 그래픽스 윈도우
void glViewport(GLint x, GLint y, GLsizei w, GLsizei h); 디폴트로 전체 윈도우 절단 윈도우 시역 그래픽스 윈도우

37 예제 #3 : 시어핀스키 가스켓 Sierpinski라는 수학자가 만듦 시어핀스키 삼각형이라고도 한다 프랙탈 기하학의 한 예
자기 유사성을 가짐

38 시어핀스키 가스켓 생성 알고리즘 시어핀스키 가스켓 생성 알고리즘: 삼각형 내부에서 임의의 시작점 선택
삼각형의 세 정점 중에 임의의 한 점 선택 시작점과 선택된 정점 사이의 중간점 계산 중간점에 점을 찍는다 이 새로운 점을 시작점으로 대치 단계 2로 돌아감

39 기본적인 프로그램 형식 main() { initialize_the_system();
for (some_number_of_points) generate_a_point(); display_the_point(); } cleanup();

40 2차원 평면과 3차원 공간 OpenGL은 합성카메라 모형을 사용하고 2차원을 3차원의 특수한 경우로 간주
2차원 평면이 3차원 공간상에서 z = 0 인 평면에 대응한다고 가정 2차원 평면상의 한 점은 3차원 상에서는 p = (x, y, 0)으로 표현 2차원 평면 상에서는 p = (x,y)로 표현 OpenGL 내부적으로는 4차원 객체로 처리

41 OpenGL에서 기하학적 객체의 표현 (1) 선분 한쌍의 점 glBegin(GL_LINES);
glVertex2f(x1, y1); glVertex2f(x2, y2); glEnd(); 한쌍의 점 glBegin(GL_POINTS);

42 OpenGL에서 기하학적 객체의 표현 (2) 기하학적 데이터의 표현 방법에 대한 고려 고수준의 추상화 : 객체 지향 접근법
new_point = old_point + random_number OpenGL : 객체 지향 접근법을 지원하지 않음 저수준의 추상화 : 정수, 실수 등의 개별 변수 사용 중간 수준의 추상화 : 배열을 사용 typedef GLfloat point2[2]; point2 p; GLfloat p[2]; 와 동일

43 Display 함수 – 한 점 생성 void display(void) {
static point2 p = {300.0, 200.0}; int i; long rand(); i = rand() % 3; p[0] = ( p[0] + triangle[i][0]) /2; p[1] = ( p[1] + triangle[i][1]) /2; glBegin(GL_POINTS); glVertex2fv(p); glEnd(); }

44 색 속성의 설정 시어핀스키 가스켓 프로그램의 속성 설정 화면의 초기화 색 색상의 지정 점의 크기 설정
glClearColor(1.0, 1.0, 1.0, 1.0); 색상의 지정 glColor3f(1.0, 0.0, 0.0); 점의 크기 설정 glPointSize(2.0); /* 단위 : 화소수 */

45 2차원 가스켓 프로그램 (1) #include <GL/glut.h> void ResetRC(void) {
glClearColor(1.0, 1.0, 1.0, 1.0); // 흰색의 화면 glColor3f(1.0, 0.0, 0.0); // 적색으로 그리기 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 500.0, 0.0, 500.0); glMatrixMode(GL_MODELVIEW); }

46 2차원 가스켓 프로그램 (2) void display(void) {
typedef GLfloat point2[2]; // x, y 좌표 데이터 정의 point2 vertice[3]= {{0.0,0.0}, {250.0, 500.0}, {500.0,0.0}}; // 삼각형 int j, k; long rand(); // 난수 발생기 point2 p = {75.0, 50.0}; // 초기 시작점 glClear(GL_COLOR_BUFFER_BIT); // 윈도우 클리어

47 2차원 가스켓 프로그램 (3) for (k=0; k < 500000; k++) {
j = rand() % 3; // 3 꼭지점중 임의의 하나 선택 p[0] = (p[0] + vertice[j][0]) / 2.0; // X좌표 생성 p[1] = (p[1] + vertice[j][1]) / 2.0; // Y좌표 생성 glBegin(GL_POINTS); glVertex2fv(p); // 생성된 점의 출력 glEnd(); } glFlush(); // 버퍼를 비움 = 강제 출력

48 2차원 가스켓 프로그램 (4) void main(int argc, char** argv) {
void ResetRC(), display(); glutInit(&argc,argv); //초기화 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500,500); //500 X 500 윈도우 설정 glutInitWindowPosition(0,0); // 윈도우를 화면의 좌측 상단에 glutCreateWindow("The Gasket Program"); // 윈도우 생성 glutDisplayFunc(display); // Gasket 출력 함수 호출 ResetRC(); // 속성 설정 glutMainLoop(); // Event Loop }

49 실행 결과

50 Visual C++을 이용한 OpenGL 프로그램 작성
필요한 파일들 라이브러리 opengl32.lib, glu32.lib는 Visual C++에서 제공됨 glut32.lib를 내려 받고 컴파일러에 경로 지정 DLL 파일 opengl32.dll, glu32.dll 파일을 시스템에서 기본 제공 glut32.dll 파일을 내려 받아 C:\windows\system 디렉토리에 복사 헤더 파일 gl.h, glu.h glut.h를 내려 받고 시스템 헤더 파일 폴더에 두거나 컴파일러에 새로이 경로 지정

51 컴파일 방법 책의 예제 프로그램 소스 파일을 더블클릭 Build 메뉴에서 Rebuild All을 선택
 *.dsw, *.dsp 등 프로젝트 파일을 자동으로 생성 예상되는 에러들 헤더 파일 또는 라이브러리 찾기 오류 경로 지정 : Tools 메뉴의 Directories 탭에서 Include Files 항목과 Library Files 항목 확인

52 링크 에러 링크시에 함수가 정의되어 있지 않다는 에러 Project 메뉴의 Settings 부메뉴의 Link 탭 선택
opengl32.lib, glu32.lib, glut32.lib가 포함되도록 함

53 함수 에러 교재는 unix 컴퓨터 기준으로 프로그램 작성 random()  rand()로 변경해야 함
exit()  exit(0)로 변경해야 함

54 Report #1 예제 프로그램 #2에서 서로 다른 크기의 사각형 3개(빨간색, 초록색, 파란색)를 임의의 위치에서 시작하여 움직이는 프로그램을 작성하여라.


Download ppt "제 2 장. 그래픽스 프로그래밍 : OpenGL 개요/ 예제 프로그램"

Similar presentations


Ads by Google