![Computer Graphics Middle Exam](/blog/assets/img/graphicsicon.png)
Computer Graphics Middle Exam
2023, Apr 19
컴퓨터그래픽스
Ch.1 Introduction
- Computer Graphics: 컴퓨터를 이용하여 영상을 제작하느 기술
- 영상 관련 학문 분야
- 영상처리: 입력, 출력이 모두 영상
- 컴퓨터 비전: 입력이 영상이며 출력은 심볼
- 컴퓨터 그래픽: 입력이 심볼이며 출력은 영상
- AI: 입력, 출력이 모두 심볼
- 이미징: 2차원 이미지 표현
- 모델링: 3차원 오브젝트 표현
- 렌더링: 3차원 모델들로부터 2차원 이미지 생성
- 애니메이션: 시간의 흐름의 따라 변화를 시뮬레이
Ch.2 Graphics Systems and Models
- 컴퓨터 그래픽스 시스템 구성요소
- 입력 장치, 중앙처리 장치, 그래픽 처리 장치
- 메모리, 프레임 버퍼, 출력 장치
- 3차원 물체를 입력할 수 있는 방법: 3D Scanner
픽셀과 프레임 버퍼
- 래스터 방식(Raster)
- 그래픽스 시스템 안에서 픽셀의 배열(래스터)로 생성
- 각 픽셀의 영상은 한 위치나 작은 영역에 대응
- 픽셀은 프레임 버퍼라고 부르는 메모리의 한 부분에 집단으로 저장
- 해상도
- 프레임 버퍼의 픽셀 수가 우리들이 볼 수 있는 영상의 상세함을 결정
- 8피트 깊이의 프레임 버퍼: 2의 8승개의 색 표시
- 프레임 버퍼의 깊이(정밀도)가 얼마나 많은 색을 표현할 수 있는지를 결정
- 레스터화(주사변화)
- 응용프로그램에 의하여 픽셀에 관한 정보를 처리하여 프레임 버퍼에 저장시키는 것
CPU, GPU
- CPU
- 일반처리와 그래픽 처리를 둘다 수행
- 래스터화, 스캔변환
- GPUs
- 특정 그래픽 기능을 수행하도록 맞춤처리
- 높은 수준의 병렬
Ch.3 Windows Programming
윈도우 생성 과정
Ch.4 OpenGL
OpenGL 특징
- 2D와 3D 그래픽스 API로 가장 널리 사용되는 산업계 표준으로 성장
- 그래픽스 하드웨어에 대한 소프트웨어 인터페이스
- 하드웨어에 독립적, 상위수준의 그래픽스 API이므로 객체 단위 프로그래밍 가능
- 플랫폼에 독립적
- 다양한 그래픽스 기능을 지원하여 응용 소프트웨어 개발 용이
- 모델링, 변환, 색상, 명암, 그림자 등의 고급 그래픽스 처리 기능 제공
- 가속 하드웨어를 사용해 처리하는 경우 많은 양의 그래픽 데이터 실시간 처리 가능
OpenGL 장점
- 안정성
- 신뢰성
- 확장성
- 편리성
-
문서화
- 저수준 API
- 장면을 묘사하는것이 아니라 구체적 프러시져를 호출
- 하드웨어와 거의 직접 연관(성능 최대 발휘)
- 고수준 함수
OpenGL 설계원리
- 범용성
- 운영체제에 무관
- 효울성
- 그래픽 하드웨어의 가속 기능을 최대 발휘
- 공통 부분을 찾아내어 성능 극대화
- 공통 부분이 아닌것에는 활성,비활성 기능 모드 제공
- 독립성
- 기능간의 독립성 최대 보장
- 기능끼리 서로 얽혀 발생하는 오류 방지
- 완전성
- 다소의 하드웨어가 확장 기능을 지원하면 표준기능으로 변경
- 특정 하드웨어 기능에 대해서는 ARB 확장 형태로 명령어를 제공
- 소프트웨어적으로라도 실행할 수 있도록 배려
- 상호 작업성
- 그래픽 명령은 A컴퓨터에서 내리되 실행은 B컴퓨터에서
- 클라이언트-서버 모델 지원
- 성능이 낮은 클라이언트 컴퓨터가 고성능 서버를 이용
파이프라인
- GPU 설게원리
- cpu파이프 라인과 유사
- 분업에 의한 동시처리로 처리속도를 극대화
- 파이프라인 서브 프로세스는 모두 하드웨어화
OpenGL 상태
- OpenGL은 상태 머신
- OpenGL 함수는 2가지 유형이 있음
- primitive 생성
- primitive가 표시되면 출력을 발생시킬 수 있음
- 정점이 처리되는 방법과 primitive의 모양은 상태에 의해 제어됨
- 상태 변경
- 변환 함수
- 어트리뷰트 함수
- primitive 생성
- 지엘의 역할 = 상태변수 설정
- 파이프라인은 상태변수를 참조해서 자동으로 실행됨
OpenGL 함수 형식
-
벡터 타입
- 지엘은 API
- 명령어가 아니라 함수명이며, 그러나 혼용함
- 지엘은 비 객체지향적
- 처리속도를 향상
- 함수 오버로딩이 불가능
- 3차원 정점이라면 glVertex3f(), 2차원 정점이라면 glVertex2f()
OpenGL 라이브러리
- 지엘 라이브러리
- 렌더링 기능을 제공하는 함수 라이브러리
- 지엘 유틸리티 라이브러리
- 50여개의 함수. GL 라이브러리의 도우미
- 다각형 분할, 투상, 2차원 곡면, 너브스 등 고급기능을 제공하는 함수
- GL함수로 작성
- 지엘 유틸리티 툴 킷
- 사용자 입력을 받아들이거나 화면 윈도우를 제어하기 위한 함수
- 윈도우 운영체제 기능과의 인터페이
Windows 프로그래밍의 기본
- 그래픽 디바이스 인터페이스
- 도형을 처리하는 프로그램
- 선 그리기, 컬러 관리와 같은 그래픽 함수들을 구현하는 일을 담당하는 윈도우의 구성 요소
- 모든 응용프로그램은 화면 표시 또는 인쇄 시 그래픽 디바이스 인터페이스에 처리를 의뢰하면 그래픽 디바이스 인터페이스(GDI)는 그 명령을 디스플레이 드라이버나 인쇄기 드라이버가 처리할 수 있는 형태로 변환하여 각각의 드라이버에 보냄으로써 화면 표시 또는 인쇄가 실행됨
- 윈도우 시스템의 WIN32라이브러리
- 2차원 그래픽스를 위한 함수들은 제공
- 3차원X
- OpenGL 프로그래밍 관점에서 볼 때 한가지 중요한 점
- 윈도우 시스템도 하나의 래스터 그래픽스 시스템으로서의 성질을 가지고 있음
- 프레임 버퍼가 정의 되어야 함
- 내부적으로 윈도우의 기본 요소들을 어떻게 표현할 것인가가 설정되어야 함
- 윈도우 시스템도 하나의 래스터 그래픽스 시스템으로서의 성질을 가지고 있음
윈도우 시스템과 OpenGL의 연결
- 윈도우를 이용하여 3차원 그래픽스를 하기 위한 방법
- 윈도우 시스템에서 제공하는 래스터 그래픽스 시스템을 기반으로 프로그래밍 해야함
- 윈도우 프로그래밍 문맥에서 하나의 추상정래스터 시스템인 OpenGL을 윈도우 시스템의 그래픽스 시스템에 연결
- OpenGL에서 제공하는 3차원 라이브러리르 통해 3차원 그래픽스를 프로그래밍함
- 실제적으로 하드웨어를 제어하는 윈도우 시스템에 의해 결과 화면 출
Window Procedure
bSetupPixelFormat()
- 두 그래픽스 시스템을 연결하기 위한 중요한 사항
- OpenGL에서 사용하기 위하여 GDI에서 제공하는 화소 형식을 적절히 지정해야 함
- OpenGL에서 사용해야할 프레임 버퍼에 대한 정보
- 프레임 버퍼는 하드웨어 성능에 의해 제한됨
- 연결 방법
- OpenGL에서 희망하는 프레임 버퍼의 성능을 화소 형식을 통해 기술함
- bSetupPixelFormat()
- GDI에 화소 정보를 넘겨주지만 실질적으로 하드웨어 성능이 따르지 못하면 윈도우는 최대한 OpenGL이 요구하는 성능에 만족 시켜주는 화소형식을 결정함
- 윈도우 시스템의 그래픽스에 관련된 모든 정보를 저장하는 디바이스 문맥에 저장 후 위의 정보를 사용함
- OpenGL에서 희망하는 프레임 버퍼의 성능을 화소 형식을 통해 기술함
그리느냐 마느냐
- 윈도우 GDI(Graphics Device Interface)
- 그래픽의 출력 담당
- 프린터에 프린트하는 기능도 담당
- 그려야 하는 범위 : 윈도우의 클라이언트 영역
- 그리기 위한 중요한 개념
- 유효화
- 윈도우 클라이언트 영억을 훼손하면 윈도우는 WM_PAINT 메시지를 응용 프로그램으로 보냄
- 프로그램은 윈도우에게 그 메시지를 받아서 처리했다는 것을 알려야함
- 윈도우에게 알리는 과정을 사각형을 ‘유효화 한다’ 라고 함
- 그려야 할 사각형의 정의
- 그릴 필요가 있는 영역인 무효 사각형만 신경쓰면됨
- WM_PAINT 자료구조에 포함되어 있음
- 유효화
- WM_PAINT
- BeginPaint() … EndPaint()
- 장점: 자동으로 유효화(Validating) 수행
- 단점: 무효사각형을 나타내는 rcPaint 속성을 가지고 있으며 윈도우의클리핑 영역 외부에는 어떤 것도 그릴 수 없음
- 그리고 싶다면 rcPaint를 다시 정의 해야함
- GetDC() … ReleaseDC()
- 장점: 클리핑 사각형은 전체 클라이언트 영역이 됨. 따라서 클라이언트 영역을 그리기 위해서 매번 무효 사각형을 다시 정의할 필요가 없음
- 단점: 무효 사각형을 유효화 하기 위해 직접 ValidateRect()를 호출. 그렇지 않으면 윈도우는 언제까지나 응용 프로그램에 WM_PAINT 메시지를 보낼 것임.(윈도우는 유효화가 이루어지지 않으면 계속 WM_PAINT 메시지를 보냄)
- BeginPaint() … EndPaint()
InvalidateRect()
-
BOOL InvalidateRect(
HWND hWnd, //무효화할 윈도우 핸들
CONST RECT *lpRect, //무효화할 사각형 영역 포인터
BOOL bErase); // BeginPaint()를 위해 플래그 지움
무효 사각형(Invalid Rectangle): 다시 그릴 필요가 있는 유일한 영역
InvalidateRect()함수는 클라이언트 영역의 임의의 부분만 그림