640 likes | 1.12k Views
그래픽스 프로그래밍. 그래픽스 프로그래밍 개요. 본 교재의 접근 방법 프로그래밍 지향적 내 용 최소한의 API 함수 소개 2 차원 프로그램 작성 시어핀스키 가스켓 예를 활용. 그래픽스 프로그래밍. 시어핀스키 가스켓 OpenGL API 기본요소와 속성 색상 관측 제어함수 가스켓 프로그램 다각형과 순환. 시어핀스키 가스켓. Sierpinski 라는 수학자가 만듦 시어핀스키 삼각형이라고도 함 프랙탈 기하학의 한 예 자기 유사성을 가짐. 알고리즘. 삼각형 내부에서 임의의 시작점 선택
E N D
그래픽스 프로그래밍 개요 • 본 교재의 접근 방법 • 프로그래밍 지향적 • 내 용 • 최소한의 API 함수 소개 • 2차원 프로그램 작성 • 시어핀스키 가스켓 예를 활용
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
시어핀스키 가스켓 • Sierpinski라는 수학자가 만듦 • 시어핀스키 삼각형이라고도 함 • 프랙탈 기하학의 한 예 • 자기 유사성을 가짐
알고리즘 • 삼각형 내부에서 임의의 시작점 선택 • 세 정점 중 임의의 한 점 선택 • 시작점과 선택된 정점의 중간점 계산 • 중간점에 점을 찍음 • 이 새로운 점을 시작점으로 대치 • 단계 2로 돌아감
프로그램 형식 main() { initialize_the_system(); for (some_number_of_points) { generate_a_point(); display_the_point(); } cleanup(); }
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)
기하학적 객체의 정의 • 선분 glBegin(GL_LINES); glVertex2f(x1, y1); glVertex2f(x2,y2); glEnd(); • 한쌍의 점 glBegin(GL_POINTS); glVertex2f(x1,y1); glVertex2f(x2,y2); glEnd();
시어핀스키 가스켓 프로그램 • 기하학적 데이터의 표현 방법에 대한 고려 • 배열을 사용 typedef GLfloat point2[2]; point2 p; GLfloat p[2]; 와 동일
Display 함수 –한 점 생성 void display(void) { typedef GLfloat point2[2]; // x, y 좌표 데이터 정의 point2 vertice[3]= {{0.0,0.0}, {250.0, 500.0}, {500.0,0.0}}; // 삼각형 static point2 p = {75.0, 50.0}; // 초기 시작점 int j, k; int rand(); // 난수 발생기
Display 함수 (con’t) for (k=0; k < 5000; 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(); // 버퍼를 비움 = 강제 출력 }
남은 문제들 • 색상 선택 • 화면상에서 이미지의 위치 • 이미지의 크기 • 윈도우 생성 • 절단 • 화면에 이미지 표시 시간
좌표계 • 초기 그래픽스 시스템에서는 정점의 위치를 출력장치상의 단위로 명시 • 장치 독립적인 그래픽스의 출현으로 • 세계 좌표계(문제 좌표계)와 장치 좌표계(래스터 좌표, 화면좌표)가 분리 • 프로그래머는 세계 좌표계에서의 좌표를 명시 그래픽스 시스템이 장치 좌표계로 변환
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
함수 호출 출력 사용자 프로그램 그래픽스 시스템 입출력 장치 데이터 입력 OpenGL API • 그래픽스 시스템 : 블랙 박스로 간주
그래픽스 함수의 그룹 • 기본 요소 함수 : 점, 선분, 다각형, 문자열 등 • 속성 함수 : 색, 선의 두께, 글자체 등 • 관측함수 : 합성 카메라 설정 • 변환 함수 : 회전, 이동, 크기 변환 등 객체 변환 • 입력 함수 : 키보드, 마우스 등의 입력 처리 • 제어 함수 : 윈도우 시스템과의 통신, 초기화, 에러 처리 등
GLU OpenGL 응용 프로그램 프레임 버퍼 GL GLUT Xlib, Xtk GLX OpenGL 인터페이스 • 라이브러리 구성 • GL : 기본 라이브러리 • GLU : GL 보다 상위 객체, 기능 지원 (U = utility) • GLUT : 윈도우 시스템과의 인터페이스 (UT = utility toolkit) X-윈도우 시스템 환경에서의 라이브러리 구성
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
기본 요소와 속성 • 기본 요소에 대한 논쟁 • 최소주의 • 점, 선, 다각형, 문자열 등 최소한의 요소 만 지원 • 이식성 우수 –모든 하드웨어에 의해 지원 • 최대주의 • 원, 곡선, 곡면, 입체 등의 다양한 요소 지원 • 보다 복잡한 응용 개발이 용이, 이식성이 약함 • OpenGL • 중간적인 입장 • GL : 작은 기본 요소 집합 • GLU : GL로부터 유도된 풍부한 객체 제공
기본 요소 • OpenGL 기본 요소 • 정점들의 집합으로 표현됨 • type : 정점들의 해석 방법을 정의 glBegin(type); glVertex*( . . .); : glVertex*( . . .); glEnd();
기본 요소 (con’t) • 점과 선분형
다각형 표시 방법 채워진 객체 다각형의 기초 • 다각형 • 닫혀있고 내부를 가진 객체 • 여러 가지 표시 방법
단순 다각형 • 단순 다각형 • 두 변이 교차하지 않음 • 명확하게 정의된 내부를 가짐 단순 다각형 비단순 다각형
볼록 다각형 • 볼록 객체(convex object) • 객체 내부 임의의 두 점 사이의 선분 위의 모든 점이 객체 내부에 존재 예) 삼각형, 사면체, 사각형, 원, 구, 평행 육면체
3차원 모델링과 삼각형 • 전형적인 렌더링 알고리즘 • 정점들이 평평한 볼록 다각형이어야 올바르게 작동 • 3차원 볼록 검사 • 검사가 쉽지 않음 : 다각형이 평평하지 않을 수 있음 • 세 정점은 항상 평평한 볼록 삼각형을 정의 보통 삼각형을 사용하여 3차원 객체를 모델링
OpenGL에서 다각형 • 다각형 : 볼록 다각형만 지원 • 삼각형과 사변형 : 다각형보다 효율적인 렌더링
OpenGL에서 다각형 (con’t) • 띠와 부채꼴(strips and fans)
문자열 • 종류 • 획(stroke) 문자열 • 래스터 문자열 • 획 문자열 (벡터 문자열) • 선분과 곡선으로 문자 윤곽을 정의 • 확대 또는 회전시켰을 때 문자의 세밀함과 모양이 유지됨
문자열 (con’t) • 래스터 문자열 • 단순하고 빠름 • 비트맵으로 정의됨 • 확대하면 거친 모양이 됨
곡선 객체 • 곡선/곡면과 같은 객체를 생성하기 위한 접근 방법 • 근사 방법 : 기본 요소들을 사용해서 근사 • 원 : n개의 변을 가진 정다각형 • 수학적 접근 방법 • 곡선 : 다항식을 이용하여 정의
속성 • 속성 • 객체가 어떻게 표현되는가를 정의 • 속성은 시스템 상태의 일부임 • 한번 설정되면 변경되기 전까지 계속해서 유지됨 • 즉시 모드 • 객체가 정의될 때 현재의 속성 값에 따라 화면에 즉시 디스플레이 됨 • 화면에 출력된 객체에 대한 정보를 저장해두지 않음
속성 (con’t) • 각 기하학적 형은 해당 속성 집합을 가짐 • 점 : 색, 크기 • 선분 : 색, 두께, 종류(실선, 단선, 점선) • 다각형 : 채우기 방법 • 획 문자열 : 높이, 너비, 서체, 종류
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
색상 (Color) • 색상 모형 • RGB 색상 모형 • 프레임 버퍼의 값이 R, G, B 각 성분 값을 나타냄 • 많은 메모리 필요 (예 : 1280 X 1024 X 24bit = 3.75MB)
색상 (con’t) • 색상 요소 표시 • 특정 하드웨어에 독립적이기 위해 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();
색상 속성의 설정 • 시어핀스키 가스켓 프로그램의 속성 설정 • 화면의 초기화 색 glClearColor(1.0, 1.0, 1.0, 1.0); • 색상의 지정 glColor3f(1.0, 0.0, 0.0); • 점의 크기 설정 glPointSize(2.0); /* 단위 : 화소수 */
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
관측 (Viewing) • 2차원 관측 • 이차원 세계에서 사각 영역을 취하고 그것의 내용을 화면의 정해진 영역으로 옮기는 것 • 사각 영역 : 관측 사각형(절단 사각형)
관측사각형 2차원 관측 • 3차원 그래픽스의 특수한 경우 • 관측 사각형이 3차원 관측 공간(viewing volume) 내에서 z = 0 인 평면 내에 있음 • 디폴트 관측 공간 : 중심에 원점을 가진 2 X 2 X 2 입방체
직교 관측 • 앞의 관측은 직교 투영의 특수한 경우임 • 점 (x,y,z)를 (x,y,0)으로 투영 • OpenGL에서 직교 투영의 명시 • void glOrtho(left, right, botom, top, near, far) • 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 관측 사각형을 정의
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
제어 함수 • 윈도우 시스템과의 상호 작용 • 초기화 : 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)
종횡비 (Aspect Ratio) • 종횡비(Aspect Ratio) • 높이에 대한 너비의 비율 • 관측 사각형의 종횡비와 윈도우의 종횡비가 같지 않으면 왜곡 현상
시역 (Viewport) • 디스플레이 윈도우 내의 사각형 영역 void glViewport(GLint x, GLint y, GLsizei w, GLsizei h); • 디폴트로 전체 윈도우
main 함수 • 이벤트 처리 • void glutMainLoop(void) • 프로그램이 이벤트 처리 루프를 시작하게 함 • 시어핀스키 프로그램 • 처리할 이벤트가 없음 • 종료키가 입력될 때까지 화면에 그래픽스 유지 • 윈도우의 디스플레이 제어 • void glutDisplayFunc(void (*func) (void)) • 윈도우가 다시 디스플레이 되어야 한다고 판단될 때마다 호출되는 함수 이름
그래픽스 프로그래밍 • 시어핀스키 가스켓 • OpenGL API • 기본요소와 속성 • 색상 • 관측 • 제어함수 • 가스켓 프로그램 • 다각형과 순환
가스켓 프로그램 #include <GL/glut.h> void myinit(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); }