사냥꾼의 IT 노트

OpenGL로 배우는 3차원 컴퓨터 그래픽스 개념 정리 - 래스터 변환 본문

OpenGL로 배우는 3차원 컴퓨터 그래픽스

OpenGL로 배우는 3차원 컴퓨터 그래픽스 개념 정리 - 래스터 변환

가면 쓴 사냥꾼 2020. 12. 7. 03:06

■래스터 변환

●래스터 = 화소 (pixel)

●래스터 변환 = 스캔 변환 (scan conversion): 화소로의 사상, 즉 물체를 표현하기 위해 어떤 화소를 밝힐 것인지를 결정하는 작업 (정규화 장치 좌표에서 뷰포트로의 사상) -> 물체 공간의 점, 선, 면이 모두 사상되어야 함

●부동 소수 좌표에서 정수 좌표로 전환되는 과정에서 반올림 발생

●정점 좌표가 화면 좌표로 변환되면 이후에는 화면 좌표만 사용됨

●선분과 내부면은 화면 좌표에서 판단되며, 지-버퍼에 의한 은면 제거와 동시에 이루어짐

●깊이와 색 보간: 정점의 z값 (정점의 색)으로부터 선분 및 내부면의 깊이 (색) 보간

●화면에 보이는 모든 것은 래스터 변환의 결과: 최대의 연산 속도, 최대의 정확성이 요구됨

■선분의 래스터 변환

●선분: 래스터 변환 알고리즘이 적용되는 가장 기본 객체 -> 선분의 양끝 정점이 화소 사상 후 래스터 변환에 의해 나머지 부분 처리

●기울기를 기준으로 샘플링

○기울기 > 1: y좌표 증가

○기울기 > 1: x좌표 증가

●교차점 계산: 부동 소수 곱셈으로 인한 속도 저하 

●DDA 알고리즘: 이젠 교차점의 y좌표에 기울기를 더한 값으로 계산

○부동 소수 덧셈이므로 속도가 훨씬 빠르나, 정수 연산에 비하면 속도는 느림 (반올림 연산)

○연산 결과의 정확도: 부동 소수의 경우 뒤자리가 잘려 나가며, 연속적인 덧셈에 의한 오류 누적

○표류 (Drift): 선택된 화소가 실제 선분에서 점차 멀어지는 현상

●브레스넘알고리즘: 결정 변수에 의해 중점이 선분의 위인지 아래인지를 판단하는 알고리즘

○모든 것을 정수 연산으로 바꾼 기법이라 속도가 빠름

○표류 현상이 발생하지 않음 (하드웨어 구현)

○첫 8분면에서만 정의함

○원 생성 알고리즘

●화소 좌표: 일반적으로 화소 좌하단 모서리를 기준으로 부여함

○화소: 일정한 크기를 지닌 영역

○선분 길이 조정을 위해 마지막 화소는 제외시킴

○면적 조정을 위해 외곽 화소는 제외시킴

 

■다각형의 래스터 변환

●현시적 표현: y = 2x + 4

●묵시적 표현: f(x, y) = y - 2x - 4 = 0

●파라미터 표현: (t, 2t + 4)

●삼각형의 래스터 변환: p, q, r등 다각형의 모든 정점을 항상 반시계 방향으로 정의함

○먼저 정의된 정점을 (x1, y1)으로, 나중에 정의된 정점을 (x2, y2)로 정의

○선분은 반시계 방향으로 진행

   1. 왼쪽: f(x, y) > 0

   2. 오른쪽: f(x, y) < 0

●주사선 채움 알고리즘 (잔처리): 채움 다각형을 래스터 변환함 (홀수 규칙 사용)

○채움 다각형: 내부 화소를 일정한 색으로 채워 넣은 다각형

○홀수 규칙: 현재 교차점 번호가 홀수이면 짝수가 되기 직전까지 화소를 칠해가는 방법 => 길이 보존을 위해 짝수번째는 포함하지 않음

○극대점: 교차하지 않은 것으로 간주함

○극소점: 2번 교차한 것으로 간주함

○극대 및 극소점: 1번 교차한 것으로 간주함

○주사선과 평행인 경우는 선분이 아예 없는 것으로 간주함

●공간적 응집성: 인접 화소끼리는 같은 색이 칠해질 확률이 높으며 같은 색의 화소끼리 서요 모여 있다는 특성

●선분 리스트 (선분 테이블): 활성화 선분 리스트를 만들기 위해 다각형을 구성하는 모든 선분에 대한 정보를 망라한 것

  1. 선분 위쪽 끝점의 y좌표

  2. 선분 아래쪽 시작점의 x좌표

  3. 선분 기울기의 역수

●내외부 판정 : 블록 다각형에서만 성립하며, 왼쪽이 내부임

○오목 다각형: 반드시 하나 이상의 정점이 어떤 선분의 오른쪽에 있음

○벡터 외적

●분할

●논 제로 와인딩 규칙: 주어진 화소가 다각형 외부인지 내부인지를 판단하는 데 쓰이는 규칙

○감싸기 수: 선분이 반시계 방향으로 그점을 몇번이나 감싸는가...최종 감싸기 수가 0이 아니면 내부점으로 간주함

●씨앗 채움 알고리즘

  1. 어떤 화소가 다각형 내부임을 확인

  2. 이를 씨앗으로 해당 화소의 색을 인근으로 번져 나가게 함

  3. 경계 채움와 홀수 채움 알고리즘

○경계 채움 알고리즘: 4-방향 또는 8-방향으로 경계 색상을 만날 때까지 채워 나가는 방법

○홍수 채움 알고리즘: 현재 다각형 내부 색이 완전히 동일할 때, 현재 색이 계속되는 한 지속적으로 번지는 방법

■보간법

●무게중심 좌표: 삼각형 내부를 세 정점의 합으로 표현했을 때의 계수 -> 주어진 정점의 색/깊이로부터 내부 화소의 색/깊이를 보간하는 데 사용됨

●컨벡스 헐: 주어진 점을 모두 포함하는 가장 작은 볼록 다각형

●경계 상자: 테스트 대상을 일정 크기의 사각형으로 국한 시키는 것

●양방향 선형 보간: 벡터 외적보다 상대적으로 빠르며, 무게중심 좌표를 구하는 데 쓰임

■OpenGL의 그래픽 요소

※모든 지엘의 기본 요소는 정점으로 명시됨

●다각형의 제약 조건 -> 분할 못함

○단순 다각형

○볼록 다각형

○평면 다각형

●기본 요소의 속성

○색 (color)

○크기 (size)

○두께 (width)

○패턴 (stipple pattern)

●GL_POINTS (점)

●GL_LINES (선)

○GL_LINE_STRIP

○GL_LINE_LOOP

●GL_POLYGON (도형)

○GL_TRIANGLES

○GL_QUAD_STRIP

○GL_TRIANGLE_STRIP

○GL_TRIANGLE_FAN

●void glShadeModel(): 다각형의 내부 채움 모드 설정

○GL_FLAT: 단일 색상

○GL_SMOOTH: 색상 보간

 

■비트맵과 포스트스크립트

●비트맵: 영상을 화소 단위 배열로 표현한 것 -> 영상을 구성하는 개별 화소의 색을 표현하거나 저장하는 특징이 있음

●에일리어싱: 계단 모양의 거친 경계선이 생기는 현상

●포스트스크립트 (벡터): 화소 개념은 없지만, 영상을 객체 단위로 명시한 것 (정점 좌표가 필요함)

○그래픽 메타파일: 렌더링 결과, 모델링 결과, 렌더링 명령어를 저장하는 형태

●자석 라소: 주사선을 따라서 왼쪽에서 오른쪽으로 급격한 색 변화가 일어나는 화소를 추적한 후 윤곽선으로 간주하여 객체를 체포하는 방식 (자동 추적)

●영상 압축

○무손실 압축: 완벽 복원

○손실 압축: 더 높은 압축률

●BMP: 일반적으로 압축을 가하지 않은 파일

●GIF: 무손실 압축을 사용한 비트맵 파일 (256 컬러)

○GIF89u: 애니메이션을 위한 파일 형식

●PNG: 무손실 압축이고, 더욱 향상된 투명성 제어 기능을 가짐

●JPEG: 손실 압축 기법 (24bit)

 

■에일리어싱과 안티 에일리어싱

●샘플링: 주어진 신호를 저장하기 위한 표본 추출 작업

●언더 샘플링: 원래의 신호를 왜곡하여 에일리어싱을 초래 (므와르 패턴)

●나이퀴스트 주파수: 샘플링 이론으로, 원래 신호 x 2

●스트로 보스코프 효과: 시간적 에일리어싱 (속도를 시각이 못 따라감)

●포인트 샘플링: 화면 사상에 사용되는 가장 일반적인 방법으로, 정중앙 또는 임의의 위치에서 물체 색을 해당 화소의 색으로 취하는 방법

●슈퍼 샘플링: 실제 화면 해상도보다 더욱 큰 해상도로 샘플링한 후, 이를 부분화소로 분할하여 평균해 해당 화소에 적용하는 방법

●지터링: 임의로 정해진 불규칙한 위치에서 샘플링함

●영역 샘플링: 물체가 차지하는 영역의 크기를 가중치로 하여 해당 화소의 색을 결정하는 방법 -> 화소 밝기를 면적에 비례하게 하는 방법

○동일 가중치

○피라미드 가중치

○원뿔 가중치

●사전 필터링: 물체 면적이 화소의 몇 퍼센트를 점유하는지를 미리 계산하는 방법

●블러링: 영상의 저주파 성분만을 걸러내는 저역 통과 필터를 사용한 결과 -> 블러링에 의한 안티 에일리어싱은 빠르지만 실제 물체의 색이 아니기 때문에 정확도가 떨어짐