오다기리 박의 알고리즘 노트

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 09. 래스터변환(Rasterization) 본문

컴퓨터 그래픽스/OpenGL

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 09. 래스터변환(Rasterization)

오다기리 박 2019. 2. 14. 21:13

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


Chapter 09. 래스터변환(Rasterization)

Section 01. 래스터변환

정점, 선분, 다각형 내부를 표현하기 위해 어떤 화소를 선택해야 하는지를 결정하는 작업


Section 02. 선분 래스터변환

선분의 기울기 > 1 : y 좌표를 1씩 증가시키면서 래스터변환

선분의 기울기 < 1 : x 좌표를 1씩 증가시키면서 래스터변환


  • 교차점 계산

  • DDA(Digital Differential Analyzer) 알고리즘

    • 다음 교차점의 y좌표 = 이전 교차점의 y좌표 + 기울기

  • 브레스넘(Bresenham) 알고리즘 / 중점 알고리즘

    • 장점 : 연산속도

  • 화소 좌표

    • 주소할당 방식


Section 03. 다각형 래스터변환

  • 그래픽 수식 표현

    • Explicit Forms

      • y = 2x +4

    • Impicit Forms

      • f(x,y) = y - 2x - 4 =0

    • Parametric Representation

      • (t, 2t + 4) or (t^2 +1, 2(t^2 +1) + 4)

  • 삼각형 래스터변환

    • 2차원 평면에서 점<math xmlns="http://www.w3.org/1998/Math/MathML"><mo>&#xA0;</mo><mi>P</mi><mfenced><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>,</mo><msub><mi>y</mi><mn>1</mn></msub></mrow></mfenced><mspace linebreak="newline"/></math>와 점<math xmlns="http://www.w3.org/1998/Math/MathML"><mi>Q</mi><mfenced><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>,</mo><msub><mi>y</mi><mn>2</mn></msub></mrow></mfenced></math>를 연결하는 직선을 음함수로 표현하면 <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>f</mi><mfenced><mrow><mi>x</mi><mo>,</mo><mi>y</mi></mrow></mfenced><mo>=</mo><mfenced><mrow><msub><mi>y</mi><mn>1</mn></msub><mo>-</mo><msub><mi>y</mi><mn>2</mn></msub></mrow></mfenced><mi>x</mi><mo>+</mo><mfenced><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>-</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfenced><mi>y</mi><mo>+</mo><msub><mi>x</mi><mn>1</mn></msub><msub><mi>y</mi><mn>2</mn></msub><mo>-</mo><msub><mi>x</mi><mn>2</mn></msub><msub><mi>y</mi><mn>1</mn></msub><mo>=</mo><mn>0</mn></math>

      어떤 화소가 삼각형 내부에 있다면 그 화소의 좌표를 각 선분의 음함수 식에 대입했을 때 양수가 되어야한다.

  • 주사선 채움(Scan Line Fill) 알고리즘

    • Scan Line과 다각형의 교차점을 계산한다.

    • 홀수~짝수 구간만 칠한다. (1<=x<2, 3<=x<4)

    • 예외

      • 극대점(H,F,C) : 교차점 = 0 으로 간주. 극대점이 속한 화소는 칠해지지 않는다.

      • 극소점(A,G) : 교차점 = 2 으로 간주. 극소점이 속한 화소는 칠해진다.

      • 극대점이면서 극소점(B) : 1번 교차한 것으로 간주.

      • Scan line과 평행한 부분(DE) : 해당 선분이 없는 것으로 간주.

  • 씨앗채움 알고리즘(Seed Fill Algorithm)

    • 주사선 채움 알고리즘에 비해 오랜 실행시간이 필요

    • 정점의 내외부 판정 방법 1

      • 오목 볼록 판정

        • 다각형의 모든 정점을 대상으로 그 정점이 어떤 선분의 오른쪽에 있는지 확인하거나,

        • 이어지는 선분끼리 외적을 구하여 180도보다 크면 오목 다각형이다.

      • 볼록 다각형이라면

        • 다각형의 선분을 반시계 방향으로 따라가면서 그 정점이 선분의 왼쪽에 있으면 다각형 내부이다.

      • 오목 다각형이라면

        • 분할(Tessellation)하여 삼각형으로 분할한다.

    • 정점의 내외부 판정 방법 2 (오목 볼록 무관하게)

      • 홀수 규칙(Odd Parity Rule)

        • 어떤 점에서 다각형 외부를 향해 직선을 그을 때 그 직선이 다각형 변과 홀수 번 교차하면 그 점은 다각형 내부

    • 씨앗채움 알고리즘

      • 어떤 화소 하나가 다각형 내부임이 확인되면 씨앗채움 알고리즘을 사용하여 다각형 내부를 채울 수 있다.

      • 내부 화소를 씨앗으로 해서 해당 화소의 색을 인근으로 번져 나가게 하는 방법.

      • 방식1 : 경계채움 알고리즘 (Boundary Fill Algorithm)

        • 경계화소 색이 동일해야 한다.

      • 방식2 : 홀수채움 알고리즘

        • 경계화소 색이 서로 달라도 된다.


Section 04. 보간법

  • 무게중심(barycentric coordinate)

    • 외적이용

      <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>G</mi><mo>=</mo><mi>&#x3B1;</mi><mi>P</mi><mo>+</mo><mi>&#x3B2;</mi><mi>Q</mi><mo>+</mo><mi>&#x3B3;</mi><mi>R</mi><mspace linebreak="newline"/><mn>0</mn><mo>&#x2264;</mo><mi>&#x3B1;</mi><mo>,</mo><mi>&#x3B2;</mi><mo>,</mo><mi>&#x3B3;</mi><mo>&#x2264;</mo><mn>1</mn><mo>,</mo><mo>&#xA0;</mo><mo>&#xA0;</mo><mi>&#x3B1;</mi><mo>+</mo><mi>&#x3B2;</mi><mo>+</mo><mi>&#x3B3;</mi><mo>=</mo><mn>1</mn><mspace linebreak="newline"/><mi>&#x3B1;</mi><mo>=</mo><mfrac><mrow><mo>&#x25B3;</mo><mi>G</mi><mi>Q</mi><mi>R</mi></mrow><mrow><mo>&#x25B3;</mo><mi>P</mi><mi>Q</mi><mi>R</mi></mrow></mfrac><mo>,</mo><mo>&#xA0;</mo><mi>&#x3B2;</mi><mo>=</mo><mfrac><mrow><mo>&#x25B3;</mo><mi>G</mi><mi>R</mi><mi>P</mi></mrow><mrow><mo>&#x25B3;</mo><mi>P</mi><mi>Q</mi><mi>R</mi></mrow></mfrac><mo>,</mo><mo>&#xA0;</mo><mi>&#x3B3;</mi><mo>=</mo><mfrac><mrow><mo>&#x25B3;</mo><mi>G</mi><mi>P</mi><mi>Q</mi></mrow><mrow><mo>&#x25B3;</mo><mi>P</mi><mi>Q</mi><mi>R</mi></mrow></mfrac><mspace linebreak="newline"/><mi>&#x3B1;</mi><mo>=</mo><mfrac><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>G</mi><mo>-</mo><mi>Q</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>R</mi><mo>-</mo><mi>Q</mi></mrow></mfenced></mrow></mfenced><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>P</mi><mo>-</mo><mi>Q</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>R</mi><mo>-</mo><mi>Q</mi></mrow></mfenced></mrow></mfenced></mfrac><mo>,</mo><mo>&#xA0;</mo><mi>&#x3B2;</mi><mo>=</mo><mfrac><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>G</mi><mo>-</mo><mi>R</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>P</mi><mo>-</mo><mi>R</mi></mrow></mfenced></mrow></mfenced><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>P</mi><mo>-</mo><mi>Q</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>R</mi><mo>-</mo><mi>Q</mi></mrow></mfenced></mrow></mfenced></mfrac><mo>,</mo><mo>&#xA0;</mo><mi>&#x3B3;</mi><mo>=</mo><mfrac><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>G</mi><mo>-</mo><mi>P</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>Q</mi><mo>-</mo><mi>P</mi></mrow></mfenced></mrow></mfenced><mfenced open="|" close="|"><mrow><mfenced><mrow><mi>P</mi><mo>-</mo><mi>Q</mi></mrow></mfenced><mo>&#xD7;</mo><mfenced><mrow><mi>R</mi><mo>-</mo><mi>Q</mi></mrow></mfenced></mrow></mfenced></mfrac></math>

    • 양선형보간 이용 (상대적으로 빠름)

      <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>S</mi><mo>=</mo><mfrac><mrow><mi>a</mi><mn>1</mn></mrow><mrow><mi>a</mi><mn>1</mn><mo>+</mo><mi>a</mi><mn>2</mn></mrow></mfrac><mi>P</mi><mo>+</mo><mfrac><mrow><mi>a</mi><mn>2</mn></mrow><mrow><mi>a</mi><mn>1</mn><mo>+</mo><mi>a</mi><mn>2</mn></mrow></mfrac><mi>R</mi><mspace linebreak="newline"/><mi>T</mi><mo>=</mo><mfrac><mrow><mi>b</mi><mn>1</mn></mrow><mrow><mi>b</mi><mn>1</mn><mo>+</mo><mi>b</mi><mn>2</mn></mrow></mfrac><mi>Q</mi><mo>+</mo><mfrac><mrow><mi>b</mi><mn>2</mn></mrow><mrow><mi>b</mi><mn>1</mn><mo>+</mo><mi>b</mi><mn>2</mn></mrow></mfrac><mi>R</mi><mspace linebreak="newline"/><mi>V</mi><mo>=</mo><mfrac><mrow><mi>c</mi><mn>1</mn></mrow><mrow><mi>c</mi><mn>1</mn><mo>+</mo><mi>c</mi><mn>2</mn></mrow></mfrac><mi>T</mi><mo>+</mo><mfrac><mrow><mi>c</mi><mn>2</mn></mrow><mrow><mi>c</mi><mn>1</mn><mo>+</mo><mi>c</mi><mn>2</mn></mrow></mfrac><mi>S</mi></math>


Section 05. GL의 그래픽 기본요소

  • 속성(Attributes)

    • void glPointSize(GLfloat size);
      void glLineWidth(GLfloat width);
      void glLineStipple(GLint factor, GLshotr pattern);
      void glPolygonStipple(const GLubyte *mask);
      void glShadeModel(mode);


Section 06. 비트맵과 포스트스크립트

  • 비트맵 영상 : 비트맵 파일 형식으로 저장됨

  • 포스트스크립트 영상 : 그래픽 메타파일 형태로 저장됨

  • 그래픽 파일 형식

    • BMP(Bitmapped Picture)

      • MS 운영체제에서 기본적으로 사용하는 비트맵 파일로서 일반적으로 압축을 가하지 않은 파일

    • GIF(Graphic Interchange Format)

      • 무손실 압축을 사용한 비트맵 파일로서 8비트 컬러 즉, 256컬러로 제한된다. 사진이나 스캔 영상 등 다양한 컬러를 지원해야 하는 영상에는 적합하지 않은 형식이다. 웹에서 자주 사용된다.

    • GIF 89a

      • 애니메이션을 위한 파일 형식으로서 하나의 파일에 일련의 영상을 저장할 수 있다. Pinter, Premiere, Flash 등의 소프트웨어를 사용하여 만들 수 있다. 단순한 웹 애니메이션 정도에 유용하다.

    • PNG (Portable Network Graphics)

      • 웹 표준단체인 W3C에서 추천하는 파일 형식으로서 무료 사용 제약이 없다.

    • JPEG(Joint Photographic Expert Group)

      • 일종의 압축 기법. JPG, TIFF, EPS 등의 형식에 적용 가능하다. 24비트 컬러를 지원한다. 손실압축의 일종이기 때문에 파일 크기는 작지만 원래 영상을 완벽하게 복원하지는 못한다.

    • TIFF(Tagged Image File Format)

      • 8비트, 24비트 컬러를 지원하는 형식으로서 JPEG뿐만 아니라 다른 압축방법도 수용한다.

    • PDF (Postscript Description File)

      • 그려낼 물체를 PDL(Page Desciption Language) 라는 명령어로 정의한다.

      • 이러한 명령어를 해독하여 렌더링을 가해야만 그림이 그려진다.

    • EPS(Extended PostScript), SWF(Shockwave Flash), WMF(Windows Meta File), SVG(Scaleable Vector Graphic), PICT(PICTure)

      • 그래픽 메타파일 형식으로서 포스트스크립트, 비트맵, 텍스트를 동시에 저장할 수 있다.

    • 그래픽 파일 저장 방식

      • 비트맵 파일

        • 최종 렌더링 결과인 그림 자체를 저장하는 방식

      • 그패픽 메타파일

        • 모델링 결과 정점 좌표와 렌더링 명령을 저장한 파일

        • 그림 대신 해당 그림을 그려내기 위한 명령어를 저장한다.

        • 저장된 명령어 파일을 읽어서 추가적으로 렌더링을 가해야만 그림이 그려진다.


Section 07. 에일리어싱과 안티에일리어싱

  • 에일리어싱

    • 무한 해상도를 지닌 사물을 유한 해상도를 가진 화면에 프로젝션 시키는 래스터변환 과정에서 언더샘플링이 일어난다.

    • 해상도가 높아질 수록 화소 크기가 작아져 에일리어싱은 감소한다.

    • 호가대하거나 좁은 간격에서 물체 모습이 자주 변할 경우(주파수가 높을 경우) 에일리어싱이 심해진다.

  • 수퍼샘플링 (Super Sampling)

    • 하나의 화소를 부분화소(subpixel)로 분할하여 화소밝기를 계산하되 최종적으로는 이를 평균하여 하나의 화소 단위로 뿌리는 방법

  • 영역 샘플링 (Area Sampling)

    • 화소 밝기를 면적에 비례하게 하는 방법

    • 한 화소와 물체와의 교차면적을 계산해야 한다.

    • 동일 가중치 샘플링(Unweighted Area Sampling)

    • 피라미드 가중치 샘플링 (Pyramid-Weighted Area Sampling)

    • 원뿔 가중치 샘플링(Cone-Weighted Area Sampling)