Post

Open Graphics Library 10

1. 폴리곤 래스터화 (Polygon Rasterization)

  • 목적: 초기 래스터 시스템은 사용자가 채워진 다각형을 표시할 수 있게 함.
  • 특징: 라인 래스터화와 달리 다각형 래스터화에는 여러 알고리즘이 사용되며, 구현 아키텍처에 따라 선택이 달라짐.

1.1 Inside-Outside Test

  • Odd-Even Test (홀짝 테스트):
    • 점에서 시작한 선이 다각형의 변과 홀수번 교차하면 내부.
    • 짝수번 교차하면 외부.
  • 구현: 스캔 라인(scanline)을 통해 각 픽셀에서 다각형 변과의 교차 횟수를 계산.
    • 홀수: 내부
    • 짝수: 외부

1.2 Flood-Fill Algorithm

  • 단계:
    1. 경계선 채우기: Bresenham 알고리즘으로 다각형의 경계선을 따라 채움.
    2. 내부 채우기: 경계선 내부를 순차적으로 채움.
      • 시작 픽셀에서 북, 남, 동, 서 방향으로 연결된 픽셀을 반복적으로 채움. - Pseudo-code:
        1
        2
        3
        4
        5
        6
        7
        8
        9
        
        function floodFill(x, y) {
         if (readPixel(x, y) == WHITE) {
             writePixel(x, y, BLACK);
             floodFill(x-1, y);
             floodFill(x+1, y);
             floodFill(x, y-1);
             floodFill(x, y+1);
         }
        }
        

1.3 Scan-Line Fill Algorithm

  • 방법:
    • 화면 아래부터 한 줄씩 스캔 라인을 올리며 다각형 변과의 교차점을 계산.
    • 홀수번째 교차점부터 짝수번째 교차점 직전까지를 색칠.
  • Pseudo-code:
    1
    2
    3
    4
    5
    
    for (each scanline L) {
        Find intersections of L with all edges of P;
        Sort the intersections by increasing x-value;
        Fill pixels between all pairs of intersections;
    }
    
  • 특이 케이스 처리:
    • 수평선과 교차하거나 꼭짓점이 스캔 라인 위에 있을 때 교차점 제외.

1.4 성능 최적화

  • Active Edge List (AEL):
    • 각 스캔 라인의 교차 정보를 저장.
    • edge의 x값 업데이트. (x += 1/m)
    • 매번 x값 기준으로 정렬.
    • 이전 스캔 라인의 계산 결과를 활용하여 중복 계산 방지.

2. 안티 앨리어싱 (Anti-Aliasing)

  • 필요성: 래스터화된 경계선이 계단 모양으로 보이는 현상(aliasing)을 완화.
  • 방법:
    1. Area Averaging (영역 평균화):
      • 픽셀이 차지하는 영역 비율에 따라 색상을 혼합.
      • 장점: 자연스럽고 부드러운 경계.
      • 단점: 계산 복잡성.
    2. Point Sampling (포인트 샘플링):
      • 픽셀의 한 지점을 샘플링하여 전체 픽셀 색상을 결정.
      • 단순하지만 aliasing 문제가 발생.
    3. Super Sampling (슈퍼 샘플링):
      • 픽셀을 고해상도로 렌더링 후 다운샘플링.
      • 장점: 경계선이 부드러움.
      • 단점: 계산 비용이 높음.

OpenGL에서의 구현

  • 함수:
    • glHint()를 사용하여 최적 품질 지정.
    • glEnable(GL_BLEND)로 색상 혼합 활성화.

예시 및 활용

  1. Flood-Fill Algorithm: 단색으로 채워진 다각형을 렌더링할 때 활용.
  2. Scan-Line Algorithm: 복잡한 다각형을 효율적으로 채우는 데 유용.
  3. Anti-Aliasing: 고품질 그래픽스 렌더링.

3. 색상 모델 (RGB Color Model)

  • RGB 모델:
    • 색상은 기본 색상(빨강, 초록, 파랑)의 강도를 합산하여 표현.
    • 각 강도는 일반적으로 0~1 사이의 값.
    • 색상은 (r, g, b)로 표시되며, 이는 각각의 기본 색상의 강도를 나타냄.
    • 색상 큐브: RGB 모델의 색 공간은 큐브 형태로 시각화 가능.
  • 화면 디스플레이:
    • CRT 모니터는 픽셀마다 RGB 형광 물질로 구성.
    • 픽셀의 색상은 RGB 강도로 결정.

4. 조명과 음영 (Lighting and Shading)

  • 조명(Lighting): 물체 표면의 정점에서 빛 세기를 계산.
  • 음영(Shading): 조명을 통해 계산된 정점 색상을 사용해 물체 표면에 색상을 채움.
  • 조명 모델: 빛과 물체 간의 상호작용을 설명하는 모델.
    • 지역 조명 모델(Local Illumination Model): 직접 반사된 빛만 고려.
    • 전역 조명 모델(Global Illumination Model): 물체 간의 빛 반사까지 고려.

광원 유형 (Light Sources)

  • 주변광 (Ambient Light):
    • 장면 전체에 균일한 조명 제공.
    • 색상 강도는 \( I_a = (I_{ar}, I_{ag}, I_{ab}) \).
  • 점광원 (Point Light Source):
    • 공간의 특정 지점에서 모든 방향으로 빛 방출.
    • 거리에 따라 빛의 세기 감소.
  • 무한 광원 (Directional Light):
    • 특정 방향에서 오는 빛을 표현.
    • 태양광과 같은 예.
    • 거리에 상관 없는 빛의 세기.
  • 스포트라이트 (Spotlight):
    • 제한된 각도로 빛을 방출.
    • 원뿔 형태로 빛의 방향과 범위를 정의.

5. 퐁 조명 모델 (Phong Lighting Model)

  • 구성 요소:
    1. 주변 반사 (Ambient Reflection):
      • 모든 표면에서 동일한 강도로 반사.
      • 계산: \( I_a = k_a L_a \) (반사 계수 \( k_a \)).
    2. 확산 반사 (Diffuse Reflection):
      • 표면이 빛을 모든 방향으로 고르게 반사.
      • 강도는 법선 벡터(N)와 광원 벡터(L) 간의 각도 \( \theta \)에 따라 결정.
      • 계산: \( I_d = k_d L_d \cos \theta \).
    3. 정반사 (Specular Reflection):
      • 매끄러운 표면에서 특정 방향으로 반사.
      • 강도는 뷰어 방향과 반사 벡터 간 각도 \( \phi \)에 비례.
      • 계산: \( I_s = k_s L_s \cos^n (\phi) \) (광택 계수 \( n \)).
  • 빛의 세기: 각 광원의 주변, 확산, 정반사 강도를 합산.
    • \( I = I_a + I_d + I_s \).

거리 감쇠 (Distance Attenuation)

  • 거리 효과: 빛의 세기는 거리 \( d \)에 따라 감소.
    • 감쇠 함수: \( I = \frac{1}{a + b \cdot d + c \cdot d^2} \)
      • \( a, b, c \): 감쇠 계수.
      • \( a \): 기본 밝기.
      • \( b \): 선형 감소.
      • \( c \): 제곱 감소.

응용 및 예제

  1. 확산 반사 계산: \( I_d = k_d L_d \cos \theta \)를 사용해 각도에 따른 빛의 세기 계산.
  2. 정반사 계산: \( I_s = k_s L_s \cos^n (\phi) \)를 사용해 하이라이트 효과 구현.
  3. 거리 감쇠: 빛의 세기를 거리와 계수에 따라 감소시켜 사실적인 효과 추가.
This post is licensed under CC BY 4.0 by the author.