* 본 포스트는 동아대학교 2023학년도 컴퓨터 그래픽스 수업자료를 기반으로 작성되었습니다.
컴퓨터 그래픽스의 역사
컴퓨터 그래픽스의 발전
- 군사적 목적으로 초기 개발
- Ivan Sutherland의 Sketchpad 입력장치로 라이트펜 사용, GUI의 원조
- 1960s : ACM 시그라이프(SIGGRAPH) 발족 : 1974년 최초 개최된 컴퓨터 그래픽스 컨퍼런스
- 1970s : Utah 대학 중심 그래픽스 알고리즘 연구 : 랜더링 기법 개발, Edwin Catmull의 연구결과
- Gouraud Shading(고러드 쉐이딩 : 빛이 비춰지는 면들의 평균적인 명암을 계산해서 부드럽게 적용)
- Phong Shading (퐁 쉐이딩 : 화소별로 색을 계산하여 표현, 계산시간이 비교적 오래걸린다)
- 매개변수 곡면 렌더링
- Z-buffer 알고리즘 : 3차원 그래픽스의 이미지 심도 좌표 관리 방식
- 텍스쳐 매핑 : 가상의 3차원 물체의 표면에 질감을 묘사하거나 색을 칠하는 기법
- 1980s : Macintosh 등장(GUI), Adobe 창립, Ray Tracing
- Ray Tracing : 이미지의 픽셀 하나하나를 통과하는 광선들이 있다 가정, 광선을 역추적하는 방식
- 1990s : 3D 그래픽스 보급 (게임, 멀티미디어, 애니메이션 등에 사용, 물리 시뮬레이션 개발)
- 2000s : 3D 그래픽스 개인보급
- 2020s : GPU 등의 발전으로 사실적인 실시간 랜더링 가능 (VR/AR/메타버스 산업발전, 디지털 트윈)
그래픽스 표현
그래픽스 표현의 분류
- 2D : X,Y 2차원 좌표
- 3D : X, Y, Z 3차원 좌표
*2d든 3d든 화면상에는 픽셀의 형태로 표현
-벡터 그래픽스 : 그래픽에 사용된 객체들을 수학적 함수로 표현 (ex. SVG)
- 래스터 그래픽보다 파일 크기가 적음
- 수식의 형태로 표현하므로 화멱확대시에도 화질변화 없음
- 사용처 : 로고, 차트 등
- 레스터 그래픽스 : 각각이 픽셀에 대한 픽셀값을 저장하여 풀력하는 방식,
- 크기는 해상도에 비례 (확대하면 화질저하)
- 비트맵 그래픽스라고도 함
- 래스터화 : 일반적으로 렌더링 과정이 래스터화
- 벡터화 : 마칭큐브방법이 대표적
SVG
- SVG(Scalable Vector Graphics), 웹 친화적인 벡터파일 포맷
- 점과 선을 기반으로 하는 수학공식을 통해 이미지 저장
- 로고와 복잡한 온라인 그래픽에 적합
- XML 코드로 작성, 모든 텍스트 정보를 텍스트로 저장
- 장점 : 해상도 유지, 파일 크기 작음
- 단점 : 고품질 디지털 사진 표현이 어려움
3D 그래픽스의 처리과정
- 모델링(기하학적 형상 제작) -> 프로젝션(원근 투영법, 평행 투영법) -> 렌더링 (3차원 물체에 색상과 명암을 부여)
- 모델링 : 3차원 좌표계에 물체의 모양을 표현하는 과정
- 와이어프레임 모델, 다각형 표면 모델, 솔리드 모델링, 3차원 스캔에 의한 모델링
- 투영 : 3차원 객체를 2차원 화면에 투영
- 평행 투영법 : 원근감을 무시하고 투영
- 원근 투영법 : 원근을 적용하여 투영
- 랜더링 : 3차원적인 질감을 더하여 현실감을 추가하는 과정
- Ray Tracing(광선 추적법)
- 쉐이딩, 텍스쳐 매핑, 그림자
- 은면 제거(Hidden Surface Removal)
컴퓨터 그래픽스 활용
- CAD, 애니메이션, 시뮬레이션, 디자인, 게임, 데이터 시각화, 프레젠테이션, GUI, 멀티미디어, 이미지처리, 공간정보 표현 등 다양하게 활용
컴퓨터 그래픽스 시스템 구성
- 하드웨어
- 프로세서 : CPU, GPU
- 메모리 : 시스템 메모리, 프레임 버퍼
- 출력장치 : 프린터, 플로터, 3D프린터 (하드카피 장치)
- 입력장치 : 마우스, 그래픽스 태블릿, 조이스틱, 라이트 펜 등(2차원) / 3D디지타이저, 스캐너, 모션캡저 장치 등(3차원)
- 그래픽스 프로그램 : 일반적으로 그래픽스 라이브러리를 이용하여 개발
- 그래픽스 데이터 베이스 : 2차원 또는 3차원 물체 및 주변환경을 기술하는 데이터
그래픽스 소프트웨어
그래픽스 소프트웨어
- 그래픽스 라이브러리
- CORE, GKS, PHIGS, OpenGL, Java 3D 등
- Open GL ES, WebGL : 웹브라우저 상에서 실행되는 그래픽스르 지원하는 JavaScript API 제공, Canvas를 이용하여 3D 그래픽스 기능으로 확장가능
- 그래픽스 응용프로그램
장치 인터페이스 (Device Interface)
- 그래픽스 입력 장치들과 시스템이 연결되어 사용할 수 있도록 처리하는 표준
- CGI(Computer Graphics Interface) 표준
- ANSI Standard
- 장치 드라이버 필요
그래픽 데이터의 교환
- CGM(Computer Graphics Metafile) : 그래픽 정보를 데이터파일에 저장하고 전송하기 위한 표준
- ANSI Standard
- CAD(Computer Aided Design)/CAM(Computer Aided Manufacturing)
OpenGL
- 실리콘 그래픽스(SGI)에서 개발
- 플랫폼에 독립적, 다양한 그래픽스 기능을 지원
- OpenGL 가속하드웨어(그래픽카드)는 셰이딩 언어를 하드웨어적으로 가속하는 기능 제공
- 장점
- 안정성
- 신뢰성 및 이식성 : 운영체제나 윈도우 시스템에 상관없이 동일한 출력결과를 생성
- 확장성 : 다양한 종류의 시스템에서 동일하게 작동
- 편리성
- 문서화 : 사용시 참고할 자료가 잘 정리되어있음
- WebGL : 웹브라우저 상에서 실행되는 그래픽스를 지원하는 JavaScript API 제공, Canvas를 이용하여 3D 그래픽스 기능으로 확장가능
OpenGL & OpenGL & WebGL
- OpenGL(데스크톱 위주)
--경량화--> OpenGL ES(모바일, 임베디드환경 사용가능)
--언어바인딩--> WebGL(웹에서 사용가능)
- Three.js : WebGL보다는 상위계층의 유틸리티 라이브러리, WebGL에서 GLSL언어를 사용하여 프로그래밍 해야하는 부분을 추상화된 객체로 쉽게 생성하여 사용가능
2D 그래픽스
2D 그래픽스의 기본
- 점 : x,y 좌표로 정의, 속성은 크기, 명암, 색상, 모양 등
- 선 : 시작점과 끝점의 절대좌표 또는 시작점 좌표와 증가값의 상대좌표로 정의, 속성은 선의 유형, 굵기, 색상, 라인캡 등
- 다중선(Polyline) : 시작점부터 마지막 n번째 점까지 절대좌표 or 시작점과 각 좌표의 증가값으로 정의, 선 이음 속성 있음
- 원그리기 : 극좌표계 이용
(극좌표계 : 평면 위의 위치를 각도와 거리를 서서 나타내는 2차원 좌표계)
- 기타곡선 그리기 : 적당한 간격의 x값에 해당하는 곡선 상의 점을 구한 후 선분으로 연결
영역 및 다각형 채우기
- 이웃한 픽셀간의 연결방식
- 4방향 연결 방식 : 상하좌우 4방향으로 이웃한 픽셀들만 연결되었다고 간주
- 8방향 연결 방식 : 대각을 포함한 8방향으로 이웃한 모든 픽셀들이 연결되었다고 간주
- 채우기 방식
- 시드 채우기 방식 : 영역 내부의 점을 기준으로 확장을 하면서 영역에 해당하는 픽셀들을 채우는 방식
- 범람채우기(Flood-Fill) : 내부로 정의된 영역 채우기(같은 색을 가지면서 이웃한 픽셀)
- 경계채우기(Boundary-Fill) : 경계로 정의된 영역채우기(이웃하면서 경계가 아닌 픽셀)
- 페인팅 소프트웨어나 대화식 이미지 처리 프로그램에서 사용
- 다각형 주사변환 방식 : 주사선(Scanline)을 그려 내려가면서 각각의 영역을 판단해 해당하는 픽셀을 채우는 방식
-주로 벡터방식의 그리기 소프트웨어에서 사용
다각형 내부 판단 규칙
- 홀짝 규칙(Even-Odd Rule)
- 스캔라인과 다각형을 이루는 에지가 몇번 교차하는지 확인
- 홀수번째 교차하면 내부, 짝수번째 교차하면 외부로 판단
- 접기횟수 규칙(Non-zero Winding Rule)
- 홀짝 규칙의 경우 도형이 겹치는 부분이 항상 외부가 되는 문제가 있음
- 스캔라인이 아래쪽 에지와 교차하면 접기횟수를 1 증가, 위쪽 에지와 교차하면 1 감소
- 에지의 벡터 방향에 따라 차이가 있음. 시계 방향이냐 반시계 방향이냐에 따라서 결과가 다르다.
- 접기횟수가 0보다 큰 구간은 다각형의 내부영역으로 판단
폰트의 종류
- 래스터 폰트
- 사각형 그리드에 0과 1로 표현
- 비트맵에 대한 연산으로 처리해 출력속도가 매우 빠르다
- 제작은 용이하나 확대시 계단현상 발생
- 벡터 폰트
- 글자의 윤곽선을 여러부분으로 나누어 직선, 곡선등으로 표현, 이들에 대한 제어점을 저장
- MS 윈도우의 TrueType 폰트는 2차 B-Spline 곡선(주어진 여러개의 점에서 정의되는 매끄러운 곡선) 사용
- PostScript의 Type1 폰트는 3차 Bezier 곡선 사용
- 확대/축소 하여도 출력품질 유지
- 기하변환 용이, 기하변환을 위한 계산시간 증가
- 벡터폰트 처리과정
- 제어점의 좌표들에 대해 기하변환 수행
- 윤곽선의 곡선부분을 선 조각으로 나누어 다각형 형태로 표현
- 다각선 주사선 알고리즘을 이용하여 글자의 내부영역 채우기 수행
안티앨리어싱(Antialiasing)
- 래스터 출력의 문제점 : 앨리어싱
- 샘플링 오차로 인한 왜곡현상, 사선과 수평선의 굵기 차이 발생, 사선 또는 곡선의 계단현상
- 안티앨리어싱 : 물체의 경계 픽셀에 물체와 배경의 색상을 혼합해서 그려 경계를 부드럽게 표현하는 방법
- 수퍼 샘플링 기법
- 하나의 픽셀 영역을 여러개로 분할, 원래 해상도로 환원할때 픽셀의 명암값을 계산
- 영역샘플링 기법
- 얼마만큼 다각형의 내부영역에 포함되는지 면적비율 계산
2D 그래픽스 변환
- 기본적인 기하변환
- 이동(Translation) : 다각형의 경우 각 꼭지점, 원은 중점을 이동하여 다시 그린다
- 신축(Scaling) : 확대 및 축소. 어떤 한 점을 기준으로 신축.
- 회전(Rotation) : 어떤 한 점을 기준으로 회전
- 동차좌표계의 필요성 : 동차좌표계를 이용하면 행렬의 곱으로만 표현 가능
윈도우와 뷰포트
뷰잉 파이프라인
- 뷰잉 파이프라인 : 2차원 그래픽스의 뷰잉과정
- 모델좌표계 : 개별 객체의 표현
--모델링 변환-->
- 월드좌표계 : 통합된 그림, 윈도우 설정
--윈도우 뷰포트 변환-->
- 뷰잉좌표계 : 뷰포트 내의 좌표
--뷰잉좌표계의 정규화--> 정규화된 뷰잉 좌표계를 장치좌표계로 변환-->
- 장치 좌표계 : 출력될 화면 뷰포트 설정
- 윈도우-뷰포트 좌표변환 : 이동 및 신축변환을 적용하여 월드좌표계에서 뷰잉좌표계로 변환
클리핑 알고리즘(Clipping Algorithm)
- 클리핑 : 화면에 보일 영역과 보이지 않을 영역을 구분 (안보여도 될 부분에 컴퓨팅 파워를 낭비할 필요X)
- 선 클리핑
- Cohen-Sutherland 알고리즘 : 한 영역에 이웃한 주변을 8개의 영역으로 나누어,
선이 어디서부터 어디까지 도달을 하는지 판단하고 영역 내부에 있는 선분을 찾아내는 알고리즘
- 영역 클리핑
- 속이 빈 다각형 : 선 클리핑 알고리즘 적용
- 속이 찬 다각형 : 몇개의 폴리곤(closed filled polygon) 생성
- Sutherland-hodgman 알고리즘 : 뷰포트 경계와 다각형의 교차점을 찾아 내부에 있는 영역 판단
- 텍스트 클리핑
- 전체 텍스트 클리핑 : 텍스트 전체가 뷰포트에 들어올때만 출력
- 전체 문자 클리핑 : 문자 하나를 최소 단위로 판단
- 개별 문자 클리핑 : 뷰포트 경계에 걸쳐졌을 경우 내부에 포함된 부분은 출력
'CS > 기타 조각글' 카테고리의 다른 글
[빌드 및 컴파일] opencv static library & aarch64 cross-compile (0) | 2024.12.02 |
---|---|
[코테] 실행속도 차이 : scanf/printf/\n과 cin/cout/endl (0) | 2023.09.22 |
[Spark/Linux] 리눅스 환경에 스파크 설치하기 (0) | 2023.04.07 |
[이산수학] 집합과 논리 (0) | 2023.03.08 |
댓글