OpenGL - 4 OpenGL API
04_01 그래픽스 표준
-1 국제 표준
표준화(Standardization)는 “ 주어진 여건에서 최적의 질서를 유지하기 위해, 현존하거나 잠재하는 문제들에 대해, 공유성과 재사용성을 높이기 위해 규정을 재정하는 행위로 정의된다.
컴퓨터 그래픽스 분야는 ISO 표준이 제정되어 있다.
컴퓨터 그래픽스의 표준에 의하면 컴퓨터 그래픽스는 “컴퓨터 하드웨어와 소프트웨어를 사용하여 물체와 물체영상을 생성, 변형, 디스플레이, 저장하는 것”으로 정의된다.
그래픽스 분야의 표준은 다음과 같은 개념을 염두에 두고 제정된다.
1 주 전산기 독립성(Host Machine Independence)
동일한 프로그램으로 다양한 하드웨어에서 사용할 수 있어야 한다.
2 장비 독립성(Device Independence)
입출력 장비의 종류가 달라도 동일 기능을 수행하기 위한 프로그램 명령은 동일해야 한다.
3 프로그램 언어 독립성(Programming Language Independence)
프로그램을 작성할 때 어떠한 프로그램 언어를 사용해도 된다.
4 운영자 이식성(Operator Portability)
새로운 프로그램 사용법을 누구든지 쉽게 터득할 수 있어야 한다.
-2 기본 요소와 시스템 리스트
여기서 (b) - 1 처럼 둥글게 처리한 것을 원형 캡(Round cap)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(b) - 2 처럼 끝을 수직으로 잘라버린 것을 버트 캡(Butt cap)
(b) - 3 처럼 선 두께의 반만큼 확장한 것을 확장 캡(Projecting Cap)
(c) - 1 처럼 둥글게 처리한 것을 원형 연결(Round Join)
(c) - 2 처럼 잘라낸 것을 베벨 연결(Bevel Join)
(c) - 3 처럼 뾰족하게 처리한 것을 마이터 연결(Miter Join)
(d) - 1 처럼 다각형 내부를 어떤 색상으로 채워넣은 채움 다각형(Filled Polygon)
(d) - 2 처럼 점층적 변화를 준것(Gradation)
(d) - 3 처럼 사선 패턴으로 채운 것
(d) - 4 처럼 윤곽선 제거(outline)
을 통틀어서 기본 요소 외양(Primitive Aspects) - 요소들이 매 순간 어떤 모습을 띠고 화면에 표시되는 지를 말함.
기본 요소 외양이 가지고 있는 외양값을 기본 요소 속성(Primitive Attribute)라고 한다.
-3 GKS,PHIGS
그래픽스 표준은 표준이 언급하는 내용에 따라 4가지로 분류, 이는 계층 구조로 이루어져 있다.
1
상위 -> 하위
응용 프로그램 레벨(Application Level) - 가상 레벨(Virtual Level) -> 논리적 레벨(Logical Level) -> 물리적 레벨(Physical Level)
ISO 그래픽 표준에는 크게 두 가지 흐름이 있다.
1985년 제정된 GKS - 주로 2차원을 위주로 다룸.
1989년 제정된 PHIGS - 주로 3차원을 위주로 다룸.
bitmap 파일은 가장 저급하고 단순히 화소값을 저장하지만, GKS는 그림을 저장할 때 기본 요소의 위치,
속성, 가시성 등의 정보를 저장한다. GKS 메타파일(Metafile)은 그림을 저장하는 대신 그림을 만들어 낼 때
사용하는 순차적 명령어들을 저장하기도 함.
PHIGS는 GKS보다 더욱 상위 레벨의 메타파일을 사용하는데,
예를 들어서 오른쪽 로봇팔을 움직일 때 왼쪽 로봇팔은 자연스럽게 흔들고, 그 왼쪽 팔에 있는 관절들을 또 움직여주는 구조체의 최상위 객체로부터 시작하여 계층구조의 위에서 아래로 관통하면서 해당 물체를 그려낸다.
-4 언어 바인딩
언어 바인딩(Language Binding)은 그래픽 소프트 웨어 개발자를 위한 것이다.
표준을 지키라는 뜻이다.
1
2
3
4
int max(int a,int b)
{
return (a > b ? a : b);
}
에서 max라는 함수는 내가 지정한 것이지만, 표준으로 이미 지정되어 있다 치고,또 이미 지정되있다.
첫번째 파라미터에는 비교할 정수 a , 두번째 파라미터에는 비교할 정수 b를 넣으란 소리다.
내가 string(문자열)을 넣거나 하는건 표준에 어긋나는 행위라는 것이다.
표준이 제정되기까지는 오랜시간이 걸리는데, 심사에 의해 제정된 표준을 심사 표준
표준이 제정되면서 새로운 하드웨어, 소프트웨어 출현으로 표준보다 앞선 규칙이 통용되는 경우를
사실 표준 이라고한다.
04_02 API(application Programming Interface)
API는 라이브러리 함수를 만한다. 라이브러리 함수는 그래픽 하드웨어와 응용 프로그램 사이에 위치하여,
사용자가 좀 더 쉽게 그래픽 하드웨어를 제어할 수 있게 도와주는 함수들이라고 할 수 있다.
2차원 그래픽 API - PDL(page Description Language)
- 3차원 그래픽 API - 펙스(PEX)나 렌더맨(Renderman)을 들 수 있다.
펙스는 윈도우에서만 돌아가기 때문에 범용성이 좋지 않다.
3차원 그래픽 API는 라이브러리 함수의 구체성을 기준으로 크게 두 가지로 분류한다.
고수준 API(High - Level API)에서는 그림을 그리기 위한 세부 과정을 명시하는 대신, 물체를 정의하고 물체 사이의 관계를 묘사함으로써 프로그램 작성이 완료. ex) OpenInventor, VRML, Java3D 등
저수준 API(Low - Level API)에서는 실제 그림을 그리는 세부적인 과정을 일일이 명시
ex) OpenGL,Direct 3D
04_03 오픈지엘 개괄
OpenGL은 실리콘 그래픽스사의 워크스테이션용 API인 GL이 발전한 것.
아이리스 지엘(Iris GL)이 개인용 컴퓨터에 이식되기 시작했고, 이를 오픈지엘(OpenGL)이라 부르기 시작했다.
저수준 API인 OpenGL이 고수준 API보다 좀 더 세부적인 사항 수정이 쉽다.
지엘의 설계 원리는 범용성, 효율성, 독립성, 완전성 등으로 구성되어 있다.
범용성 : MS 윈도우 운영체제 뿐만아니라 유닉스 등 운영체제에서도 실행될 수 있다.
효율성 : 하드웨어 기능 중 공통적인 부분을 찾아내어 그 성능을 극대화 하는 것.
독립성 : 어떤 행위가 다른 행위에 영향을 미치지 않아야 한다.
완전성 : 특정 하드웨어 기능에 대해서는 ARB 확장 형태로 명령어를 제공함으로써 사용자마다 다른 그래픽 하드웨어를 가지고 있어, 그 하드웨어를 어떤 API가 수용하지 않으면 다른 API를 찾는 문제를 해결
상호 작업성 : 지엘 프로그램이 클라이언트가 되고 그래픽 서버가 그 명령을 서비스하는 클라이언트 - 서버 모델
지엘의 입력을 기하 기본 요소(Geometry Primitives) 나 영상 기본 요소(Image Primitives)로 구성된다.
04_04 오픈지엘 프로그래밍
이하 지엘 데이터 타입이다.
지엘 프로그램은 세 가지 요소로 구성된다.
지엘 라이브러리(GL : OpenGL Core Library)
지엘 유틸리티 라이브러리(GLU : OpenGL Utility Library)
지엘 유틸리티 툴 킷(GLUT : OpenGL Utility Toolkit)
GLU 라이브러리는 GL 라이브러리 위에 구축된 것이므로, GLU 함수 호출은 결국 GL 함수 호출로 바뀐다.
GLUT 라이브러리는 입출력 및 윈도우를 제어하기 위한 것이므로 운영체제를 호출한다.
GLUT 함수는 명령어의 번역이 운영체제 마다 달라서 프로그래머가 신경쓸 이유가 없고, 이러기에 호환성이 좋다.
GLUT의 기능 중 가장 중요한 것 중의 하나가 콜백 함수다.
GLUT에는 프로그램 제어 상태 변수 와 시스템 고정 상태 변수 등이 있다.
04_05 오픈지엘 설치와 설정
은 각자 알아서..
라고 했으나
– 추가 수정—-
R패키지 설치했던것과 똑같이 오픈지엘 설치하는데 거의 1시간을 썼습니다.
일단 일반 glut라는 것과 freeglut라는게 있는데, 예전에는 glut를 썼는데, opengl 홈페이지 들어가보면 freeglut로 대체되었습니다. 때문에, 인터넷에 검색하다보면 glut설치법과 freeglut 설치법이 따로 나뉘어져 있어 혼돈을 줍니다.
freeglut를 설치하는 것을 opengl 홈페이지에서 권하므로, freeglut를 설치하고 그에 맞는 .lib 파일과 .h파일은
visualstudio 헤더파일 있는곳과 라이브러리 있는 곳에 복사 붙여넣기 해주시면 됩니다.
그리고 freeglut를 사용시
glutInit(&argc, argv); 로 초기화를 꼭 해줘야 한다고 하네요..
다른분들은 저처럼 고생하시길 마세요.
감사합니다..
실험 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<freeglut.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(int argc,char** argv)
{
glutInit(&argc, argv);
glutCreateWindow("OpenGL Drawing Example");
glutDisplayFunc(MyDisplay);
glutMainLoop();
}
4장연습문제
- 1 그래픽 분야의 ISO 표준 중 하나인 PHIGS에는 구조체 개념이 포함되어 있다. (True/False)
-> True PHIGS는 물체의 집합을 다루는데, 그것을 구조체라 한다.
- 2 API는 프로그램 언어다. (TRUE/FALSE)
-> API는 프로그램 언어가 아닌, 프로그램 언어로 만들어진 라이브러리 함수 집합이다.( 개인생각 )
- 3 고수준 API는 장면 묘사 위주로, 구조체 렌더링 방식이 포함되어 있지 않다. (TRUE/FALSE)
-> TRUE
- 4 파라미터 리스트를 사용할 경우 시스템 테이블은 불필요하다. (TRUE/FALSE)
-> FALSE 파라미터 리스트를 사용하는 경우가 불편해서 시스템 테이블이 생겨난 것이다.
- 5 파이프라인 구조에서 서브 프로세서의 논리는 하드웨어적으로 고정되어 있다. (TRUE/FALSE)
-> TRUE
- 6 지엘이 C 함수에 대한 호출이라면 GLU는 지엘에 대한 호출이다. (TRUE/FALSE)
-> TRUE
- 7 점, 선, 삼각형 등 렌더링의 최소단위를 그래픽 ()이라 한다.
-> 기본요소
- 8 심사 표준이 제정되지 않는 상태에서 현실 시장에서 통용되는 표준을 ()이라 한다.
-> 사실 표준
- 9 ISO에서 시스템 테이블은 지엘의 ()에 해당한다.
-> 상태변수 도표
- 10 GLUT는 지엘과 () 운영체제 사이의 인터페이스다.
-> 윈도우즈
- 11 장면묘사 API에서 () 노드는 2개 이상의 노드로 구성된다.
-> 그룹
- 12 윈도우 좌상단을 화면 좌표(30,10)에 위치시키기 위한 GLUT 함수는 ()이다.
-> glutinitWindowPosition(30,10)
- 13 C 언어의 부동 소수 타입인 float에 해당하는 지엘 타입은 () 이다.
-> GLfloat
- 14 어떤 모드를 활성화하기 위한 지엘 함수는 () 이다.
-> glEnabled()
- 15 ISO 그래픽스 표준 내용을 인터넷에서 조사하여 발표해보라
-> …