OpenGL 쉐이더 프로그래밍 - 3D 그래픽스 파이프라인

타입·2024년 6월 28일

컴퓨터 그래픽스

목록 보기
3/24

그래픽스 파이프라인 (Graphics Pipeline)

  • 현실 세계의 시뮬레이션
    실제/가상 물체의 모델링
    물리학/광학의 시뮬레이션
    인간의 시각/카메라 시뮬레이션
    • 실시간 처리 목표
      대규모 병렬 컴퓨팅(MPC)로 발전
  • Vertex vs Fragment
    • 기하학 관점의 삼각형
      Vertex = 꼭짓점
    • 래스터 관점의 삼각형
      Fragment = Pixel + 관련 자료 (색상, 깊이 등)
  • Vertex Processing 단계
    Vertex Data를 좌표로 변환 (Transform)
    카메라 효과를 줘 원근감 적용
  • Primitive Assembly 단계
    고정된 Vertex를 출력에 필요한 기본 요소로 변환
    • Vertex 결합하여 하나의 Graphics Primitive로 만듦
      1 Vertex: 점
      2 Vertices: 선분
      3 Vertices: 삼각형
  • Rasterization 단계
    Vertex가 결합된 각각의 Primitive에 대해서 프레임 버퍼 상에서 어느 픽셀에 출력되어야 하는지 선정
  • Fragment Processing 단계
    각 픽셀 별로 관련 정보를 가지고 컬러를 결정
    물리학이나 광학 법칙을 이용하여 계산
  • Post-Processing 단계
    블렌딩
    Fragment 단위 처리로 다양한 효과 적용
    최종적으로 프레임 버퍼에 저장되어 모니터에 출력

프로그래머블 그래픽스 파이프라인

  • 기술 발전으로 병렬 처리 도입
    중요 단계마다 병렬 처리로 가속
    Vertex Processing과 Fragment Processing을 병렬 처리
    병렬 처리를 위해 GPU의 코어도 많아짐
  • Shader 개념
    GPU에서 돌아가며 병렬처리가 가능한 작은 프로그램
    Vertex Shader와 Fragment Shader가 각각 Vertex Processing과 Fragment Processing을 프로그래머블한 셰이더로 대체

GPU 구조의 특징

  • Registers in GPU
    3차원 좌표를 표현하기 위해 (x, y, z, w) 4개의 포인트를 사용
    한 레지스터(Cluster): float 4개 (16Bytes)
    부동 소수점인 float 계산은 속도가 빠름!
    • attribute: Vertex Shader의 input 레지스터, primitive의 속성
    • varying: Vertex Shader의 output 레지스터, 래스터라이제이션 후 Fragment Shader의 input 레지스터로 사용
    • uniform: Vertex Shader, Fragment Shader 모두 사용하는 글로벌 상수
  • 선형 보간 (Linear Interpolation)
    Primitive Assembly 단계
    사용자는 vertex의 좌표만 제공
    두 vertex를 잇는 선분의 line segment 진행, 두 점 사이의 정보를 보간하여 채움 (색상도 함께)

  • 이중 선형 보간 (Bi-linear Interpolation)
    Rasterizer의 핵심 기능
    삼각형들의 꼭짓점에 색상을 입력
    각 변들에 대하여 선형 보간하여 선분의 색상 값이 결정
    삼각형 내부의 픽셀에 대하여 한 번 더 선형 보간하여 내부 색상을 채움

GPU 내부 구조

Vertex Shader

Vertex Data -> Normalized Device Coordinate
꼭짓점 정보를 좌표상의 점으로 변환

Primitive Assembly & Rasterization

vertex 하나마다 Vertex Shader 계산, 삼각형 하나를 결합하며 3번 계산 (병렬 처리)

Primitive Assembly 과정에서 삼각형 하나에 varying 레지스터 3세트가 만들어지고,
Rasterization 과정에서 이중 선형 보간에 의해 삼각형 내부의 픽셀만큼 varying 레지스터 세트가 만들어짐

Primitive Assembly와 Rasterization 과정으로 만들어진 많은 레지스터 세트를 Fragment Shader에 넘겨줌

Fragment Shader

삼각형 내부의 각 픽셀마다 실행

varying 레지스터로 들어온 값을 Fragment Shader를 돌려 최종적으로 픽셀 값을 결정 후 output 레지스터에 출력
output 레지스터에 들어오면 바로 프레임 버퍼에 업데이트되며 화면에 삼각형 출력

profile
주니어 언리얼 프로그래머

0개의 댓글