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

Slides:



Advertisements
Similar presentations
1. 도형의 연결 상태 2. 꼭지점과 변으로 이루어진 도형 Ⅷ. 도형의 관찰 도형의 연결상태 연결상태가 같은 도형 단일폐곡선의 성질 연결상태가 같은 입체도형 뫼비우스의 띠.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
Implement of Input and Interaction
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
그래픽 하드웨어.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
OpenGL 실습 1주차.
OpenGL 시작하기.
Image & Video processing
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
Lecture #8 제 5 장. 관측(viewing).
7장 디스플레이 리스트.
신호처리 실험 (Signal Processing Lab)
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
콘텐츠 제작 프로젝트 [교재] - OpenGL 프로그래밍 가이드, 제4판, Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis 공저, 남기혁 역, 정 보문화사, [참고자료] OpenGL Programming.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
나민영 서경대학교 컴퓨터공학과 CGVR Lab 같이만들어보자 5주차 OpenCV 설정 및 기초.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Sang Il Park Sejong University
제 1 장. 컴퓨터 그래픽스 시스템과 모델 - 3D 컴퓨터 그래픽스 구조 - OpenGL API 개요
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
임베디드 실습 # LED, 7’Segment 제어
WinCE Device Driver 실습 #2
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
프로그래밍 랩 – 7주 리스트.
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
3차원 객체 모델링.
C#.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Computer Graphics OpenGL 설치 및 설정
Chapter03 캔버스(1) HTML5 Programming.
광원 제어 하기.
27장. 모듈화 프로그래밍.
19. 함수 포인터와 void 포인터.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Chapter 4 컬러( COLOR ).
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
Clipping 이진학.
4장 기하학적 객체와 변환 - 기하 1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용
정다면체, 다면체와 정다각형, 다각형의 관계 한림초등 학교 영제 6학년 5반 송명훈.
자바 5.0 프로그래밍.
다면체 다면체 다면체: 다각형인 면만으로 둘러싸인 입체도 형 면: 다면체를 둘러싸고 있는 다각형
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
CAD 실습 2013년 2학기.
데이터 동적 할당 Collection class.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Chapter 1 단위, 물리량, 벡터.
그래픽 메소드.
Chapter 1 단위, 물리량, 벡터.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
메뉴(Menu) 컴퓨터응용 및 실습 I.
9 브라우저 객체 모델.
Numerical Analysis Programming using NRs
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
Power Point 예제 디자인 적용 (서식) - (디자인적용) - (원하는 디자인 선택)
그래픽 컨트롤 (Graphic Control)
7 생성자 함수.
6 객체.
Lecture #6 제 4 장. 기하학적 객체와 변환 (1).
Presentation transcript:

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

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

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

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

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

기본 요소 (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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

색 입체

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

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

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

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

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

직교 투영(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 */

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

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

제어 함수 윈도우 시스템과의 상호 작용 초기화 : 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)

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

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

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

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

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

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

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

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

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(); }

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

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); }

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); // 윈도우 클리어

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(); // 버퍼를 비움 = 강제 출력

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 }

실행 결과

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를 내려 받고 시스템 헤더 파일 폴더에 두거나 컴파일러에 새로이 경로 지정

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

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

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

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