4장. 오픈지엘 API
표준화 : 현존하는 문제들에 대해 공유성과 재사용성을 높이기 위해 규정을 제정하는 행위
IOS표준의 컴퓨터그래픽스 : 컴퓨터 하드웨어와 소프트웨어를 사용하여 물체와 물체 영상을 생성, 변형, 디스플레이, 저장하는 것. 프로그램의 이식성을 높이는 것.
- 주 전산기 독립성: 동일한 프로그램으로 다양한 H/W 지원
- 장비 독립성: 입출력 장비 종류가 달라도 동일 기능을 수행하기 위한 명령은 동일
- 프로그램 언어 독립성: 어떠한 프로그램 언어를 사용 가능해야 함
- 운영자 이식성: 새로운 프로그램을 누구든지 쉽게 터득 가능해야 함
출력기본요소: 점, 선, 채움영역, 꺾은석, 표시 꺾은선, 문자
기본요소 외양: 두께, 패턴, 색상, 글꼴 등
기본요소 속성: 기본요소가 지니는 현재의 외양값
그래픽스 표준 4계층
Lv.응용프로그램 : 응용 프로그램이 지켜야 할 표준을 추상적 수준에서 서술 [최상위]
Lv.가상 : 출력되어야할 내용을 기본요소를 사용해서 서술
Lv.논리적 : 주어진 장비에서 해당 기본 요소를 그리기 위해 필요한 과정 서술
Lv.물리적 : 개별 입출력 장비에 관한 내용 서술
1985 GKS ) 가장 먼저 정착된 그래픽스 표준, 2차원 위주 그래픽 처리. 개별 물체. 전역 좌표계, 정규화 장치 좌표계. → 3차원 GKS-3D제정 //유럽 주도
1989 PHIGS) 주로 3차원 모델링. 물체 집합. 가시화, 전역 좌표계, 정규화 장치 좌표계, 장치 좌표계. 시점, 가시부피 등에 주안점을 둔 표준안. Lv.응용프로그램을 포함한 최상위 계층부터 관통하면서 물체 그림. // CAD 미국주도의 표준
그래픽 파일
비트맵 파일: 단순히 화면 화소값을 저장
GKS 메타파일: 그림을 만들어 낼 때 사용한 순차적 명령어들 저장
PHIGS 메타파일: GKS 메타파일의 내용을 포함 + 응용 프로그램 레벨에서 기본 요소 사이의 관계까지 저장.
API : 함수를 이용하여 프로그램을 작성하는데 직접 활용할 수 있도록 한 라이브러리 함수
=>드라이버 소프트웨어가 해당 하드웨어 제어하는 어셈블리 명령어로 바꾼다. => 프로그래머가 프로그램 수월히 작성하기 위함.
고수준 API : 추상적, 사용하기 쉽다.
그림을 그리기 위한 실제적 세부 과정을 명시하는 대신, 물체를 정의하고 물체 사이의 관계를 묘사함으로써 프로그램 작성 완료
저수준 API : 구체적,
물체를 구성하는 기본요소의 정의부터 실제 그림을 그리는 세부적인 과정을 일일히 명시. 그래픽 메모리, 그래픽 가속 칩 등 하드웨어와 밀접해서 하드웨어 성능을 최대한 발휘가능. 예 ) OpenGL, Direct3D
VRML API : 인터넷을 염두한 고수준 API.
인터넷을 통한 사용자 간의 상호작용이 있다. 가상 현실 개념을 구현하기 위한 것. 원격 사용자 사이의 상호 작용에 따라 화면 장면 변화, 현실감 증폭한다.
GL 설계 원리
- 범용성-대부분 하드웨어 실행 가능, 소프트웨어 면에서는 운영체제 무관히 설계
- 효율성-호환성 지님. 그래픽 하드웨어의 가속 기능을 최대한 발휘하기 위해
- 독립성-기능간의 독립성이 보장됨
- 완전성-하드웨어 기능을 대부분 수용/ 공통된 기능이 아닌 특정 하드웨어 기능에 대해서 ARB확장 형태로 명령어 제공
- 상호작업성-이기종 컴퓨터를 네트워크로 연결한 상태
GL은 왜 표준인가? 물체를 그리는 렌더링의 최소한으로 충분한 능력.
파이프라인 구조 : GPU의 처리 속도를 획기적으로 개선한 것. 모든 서브 프로세서 가동.
상태변수 : 물체가 어떻게 그려져야 할지 표현. GL은 서브 프로세서에게 파라미터 전달.
모드 : 상태변수보다 포괄적. 관련 기능 on/off.
OpenGL은 비객체지향(처리 속도 높이기 위해)
프로그램 구성 요소
- 지엘 라이브러리 GL : 랜더링 기능을 제공하는 함수 라이브러리
- 지엘 유틸리티 라이브러리 GLU : 지엘 라이브러리 도우미이자 일부. 고급기능 포함.
- 지엘 유틸리티 툴 킷 GLUT : 콜백 기능(입력 받기), 윈도우 화면 제어 등을 위한 윈도우 운영 체제가 실행하는 기능들. GL 프로그램과 윈도우 운영체제 사이의 인터페이스. Freeware.
glutInit() : GLUT 라이브러리 초기화 후 윈도우 시스템과 세션을 연다.
glutInitWindowPosition() : 윈도우 좌상단을 (x,y)에 위치 시킨다.
glutInitDisplayMode() : 생성될 윈도우의 디스플레이 모드를 설정.
glutReshapeWindow() : 윈도우 크기를 재조정.
glutPostRedisplay() : 현재 윈도우를 재생.
glutSwapBuffers() : 더블버퍼링에서 백버퍼와 프런트 버퍼를 교대하기 위한 함수.
5장. 오픈지엘 기본 틀
물리적 입력 장치
: 상대입력과 절대입력. 상대입력장치에서는 입력 위치의 변화량 입력, 이전 위치에 변화량을 더하여 절대 위치를 계산하는 것은 운영체제의 몫. 절대입력장치에는 절대적인 입력 위치가 그대로 입력.
논리적 입력 장치
: 입력 데이터를 받아들이는 데는 키보드나 마우스 등의 물리적 장치를 사용한다. 그러나 소스 코드 내에서 물리적인 입력 장치의 종류를 구체적으로 지정하는 대신에, 입력 기능에 바탕을 둔 논리적 입력 장치를 지정하도록 한다.
- 좌표입력기(Locator)
- 연속좌표입력기(Stroke)
- 문자열입력기(String)
- 스칼라입력기(Valuator)
- 메뉴선택입력기(Choice)
- 물체선택입력기(Pick)
- 물체 선택
1) 클릭한 곳에서 가까운 물체 선택 2) 클릭 위치를 중심으로 픽 윈도우 보여줌 3) 클릭된 부분에 중첩된 모든 물체를 순차적으로 보여주며 사용자 선택 4) 선택 물체명 키보드 입력
-입력모드 3가지
메저 : 입력장치가 응용 프로그램에 넘겨주는 값
트리거: 메저를 가져가라는 신호
메져프로세스 : 메져를 인식하여 저장하는 과정 , 일반적으로 장치를 초기화 할 때 실행되기 시작한다.
트리거 프로세스 -> 메져 프로세스 -> 프로그램
- 리퀘스트 모드 : 프로그램이 실행 중에 메저를 요구하는 방식
- 샘플 모드(=직접 모드) : 사용자 트리거 x
- 이벤트 모드 : 사용자가 선택한 입력 장치가 우선권을 쥔다. 아무때나 입력장치가 트리거 되는 순간 하나의 이벤트가 발생한 것으로 본다. 이벤트 큐를 사용. 콜백함수는 응용 프로그램이 이벤트 타입별로 처리하는 내용을 함수로 나타낸 것이다. 처음 입력 장치 초기화 이후, 모든 이벤트는 루프 문에 의해 처리된다. 새로운 이벤트가 큐에 들어왔는지를 주기적으로 검사.
지엘 프로그램 : 지엘 프로그램은 윈도우 기능 및 입출력 제어에 있어서 GLUT 라이브러리를 이용. 지엘 프로그램과 드라이버 사이에서 인터페이스 역할. 프로그래머가 등록한 함수를 콜백 테이블 형태로 저장.
콜백 함수를 실행하는 것은 GLUT 이고, 어떤 순간에 단 하나의 콜백 함수만을 실행한다.
아이들 콜백 : 큐에 이벤트가 없을 때 실행. 정의x이면 OS는 다른 일을 수행. 드라이버를 통해 주기적으로 이벤트 검사. 큐에 이벤트가 있으면 첫 이벤트를 가져와 호출. 다른 이벤트가 없는 시간을 활용하여 필요한 계산을 함.
디스플레이 이벤트 : 렌더링을 위한 이벤트 - 지엘의 모든 렌더링 명령은 대부분 디스플레이 콜백 함수 내부에 정의된다.
마우스 이벤트 : 마우스 버튼을 눌렀거나 떼었을 때 트리거 된다.
리셰이프 이벤트 : 사용자가 윈도우 크기를 바꿀 때, 키보드 이벤트 키가 눌러졌을 때, 아이들 이벤트는 큐에 아무런 명령어 없을 때 각각 호출
뷰포트 : 윈도우 내부에 설정한 작은 창
화면 좌표계(SCS) = 장치 좌표계(DCS) = 윈도우 좌표계 : 화소 단위로 좌표를 표시
_좌상단원점 좌표계 _glut vs _좌하단원점 좌표계 _gl
Reshpae 콜백
glut는 다음 3 가지의 경우에 리셰이프 이벤트가 발생한 것으로 취급한다. ( 처음 윈도우 열 때/ 옮길 때/ 크기를 조절할 때), 자동으로 디스플레이 콜백함수 실행된다.
가시부피 = 화면에 보이고자 하는 물체의 범위
glOrtho() : 윈도우 크기 조절에 따른 왜곡을 방지. 가시부피 정의. 투상면 자체의 종횡비가 뷰 포트의 종횡비가 일치해서 물체는 전혀 왜곡되지 않는다.
키보드 콜백 : 키보드 입력에 대해 호출되는 함수
마우스 콜백 : 마우스 버튼을 누를 때 또는 움직일 때 발생.
메뉴 콜백 : 메뉴 화면 출력
Idle 콜백 : 주기적으로 이벤트 검사. 큐에 이벤트가 있으면 첫 이벤트를 가져와 호출. 다른 이벤트가 없는 시간을 활용하여 필요한 계산을 함.
타이머 콜백 : 일정 시간 간격이 지나면 발생하는 이벤트가 타이머 이벤트
Dual-Port 프레임 버퍼
2중 포트 구조 (Read Port, Write Port)
그래픽 프로세서가 쓰고, 비디오 컨트롤러가 읽어서 뿌린다. 속도 차이로 깜빡꺼림 문제.
더블 버퍼링
2개의 버퍼 (프런트 버퍼와 백버퍼)
현재 비디오 컨트롤러가 읽고 있는 버퍼를 프런트 버퍼로, 기록중인 버퍼를 백 버퍼.
glutInitDisplayMode(GLUT_DOUBLE) : 초기화
glutSwapBuffers() : 프런트 버퍼 -> 백버퍼로 스위칭, 묵시적으로 glFlush()실행.
정점배열 : 정점리스트를 사용하여 함수 호출의 횟수를 줄임. 오른손 법칙으로 그림.
-실행모드 2가지
직접모드 : 물체를 화면에 그림과 동시에 생성 관련 모든 정보를 파기
보류모드 : 물체 생성 관련 정보 유지 및 재사용. 디스플레이 리스트에 의함.
디스플레이 리스트 : 반복적으로 실행 되어야 할 일련의 지엘 명령어를 디스플레이 리스트 내부에 포함시킴으로서 실행 속도 향상. 그래픽 처리 속도와 직결.
'공부 일지 > 그래픽스' 카테고리의 다른 글
컴퓨터 그래픽스 기본 이론 [OpenGL로 배우는 3차원 컴퓨터 그래픽스] (0) | 2025.01.20 |
---|