컴퓨터 그래픽스computer graphics란 컴퓨터로 이미지image를 만들어내는 모든 용법을 의미한다.

1.1. 그래픽스 분야

  • 중점이 되는 분야들
    • 모델링Modeling. 모델링이란 모양이나 눈에 보이는 속성들을 컴퓨터에 저장할 수 있도록 수학적으로 설명하는 분야를 의미한다.
    • 렌더링Rendering. 본래는 예술 용어로, 3D 컴퓨터 모델을 쉐이딩하여 생성한 이미지를 의미한다.
    • 애니메이션Animation. 연속된 이미지를 통해 움직인다는 착각을 불러 일으키는 기술을 의미한다.
  • 기타 분야들
    • 사용자 상호 작용User Interaction. 마우스나 타블릿과 같은 입력 장치, 어플리케이션, 이미지를 통한 피드백, 여러 감각적 피드백 간의 인터페이스를 다룬다.
    • 가상 현실Virtual Reality. 사용자를 3D 가상 세계에 몰입immerse시키는 분야이다.
    • 시각화Visualization. 복잡한 정보를 시각적 디스플레이를 통해 사용자에게 통찰을 주는 분야이다.
    • 영상 처리Image Processing. 2D 이미지 조작에 대해 다룬다.
    • 3차원 스캐닝Three-dimensional Scanning. 범위 탐색 기술을 통해 3D 모델을 측정하는 분야이다.
    • 계산 사진술Computational Photography. 컴퓨터 그래픽스, 컴퓨터 비전과 영상 처리 기법을 통해 물체나 장면, 환경 등을 사진으로 찍는 새로운 기법을 다룬다.

1.2. 주요 적용 분야

  • 게임Video games
  • 만화Cartoons
  • 시각 효과Visual effects
  • 애니메이션 영화Animated films
  • CAD/CAM
  • 시뮬레이션Simulation
  • 의학 촬영Medical imaging
  • 정보 시각화Information visualization

1.3. 그래픽스 API

어플리케이션 프로그래밍 인터페이스application programming interface(API)란 서로 연관된 연산을 수행하는 함수로 구성된 표준 구성을 의미한다. 그래픽스 API란 이미지 그리기나 스크린 위의 창에 3D 표면을 그리는 간단한 연산을 수행하는 함수의 집합이다. 보통 한 어플리케이션은 시각적 출력을 위한 그래픽스 API와 사용자로부터 입력을 받는 사용자 입력 API 둘로 구성된다.

1.4. 그래픽스 파이프라인

그래픽스 파이프라인graphics pipeline이란 어떤 한 관점에서 3D 원형primitive을 효율적으로 그려주는 특수한 소프트웨어/하드웨어 서브시스템을 의미한다.

1.5. 수치적 문제

보통 그래픽스는 실수를 다루기 때문에 실수를 컴퓨터 자료형으로 표현한 IEEE 부동소수점 표준을 사용한다. 관련한 표준을 IEEE 754라 부르기도 한다. 해당 표준에서는 양의 무한대, 음의 무한대, 숫자가 아님 (NaN)을 사용하고 있다.

1.6. 효율성

  1. 코드를 가장 단순하게 짠다. 중간값들은 저장하지 말고 그때 그때 계산해서 사용한다.
  2. 최적화 모드로 컴파일한다.
  3. 아무 프로파일링 도구로 가장 주요한 병목 지점을 찾는다.
  4. 자료 구조를 검토하여 지역성을 개선할 수 있는 방안을 찾는다. 가능하다면 목표 아키텍처의 캐시/페이지 크기에 맞추어 자료형의 크기를 설정한다.
  5. 수치 연산에 병목이 있다면 컴파일러가 생성한 어셈블리어를 보고 비효율적인 부분을 찾는다. 문제가 있다면 코드를 다시 작성한다.

1.7. 그래픽스 프로그램 설계 및 코딩

1.7.1. 클래스 설계

기본적으로 필요한 클래스들:

  • vector2. x, y 요소가 있는 2D 벡터 클래스. 보통 크기가 2인 배열로 구현해서 인덱싱이 가능하도록 한다. 벡터 덧셈, 벡터 뺄셈, 내적, 외적, 스칼라 곱셈, 스칼라 나눗셈 등을 지원해야 한다.
  • vector3. 3차원 벡터 클래스.
  • hvector. 네 요소로 구성된 동차 벡터.
  • rgb. RGB 세 요소로 구성된 색. RGB 덧셈, RGB 뺄셈, RGB 곱셉, 스칼라 곱셉, 스칼라 나눗셈 등을 지원해야 한다.
  • transform. 변환을 위한 4 × 4 행렬. 행렬 곱셈과 위치, 방향, 표면 법선 벡터를 적용할 멤버 함수를 지원해야 한다.
  • image. RGB 픽셀로 구성된 2D 배열. 출력 연산을 지원해야 한다.

1.7.2. 단정밀도 부동소수점 vs 배정밀도 부동소수점

효율성은 float, 수치적 오차를 최소화해야 한다면 double.

저자는 기하 연산에는 double, 색 연산에는 float을 추천한다. 삼각형 메쉬처럼 메모리 많이 먹는 애들은 float으로 저장하지만, 외부에서 접근할 땐 double로 반환해준다.

1.7.3. 그래픽스 프로그램 디버깅

과학적 방법

이미지를 만들고, 뭐가 문제인지 쳐다보는 방법이 있다. 거기서 가설을 세우고, 해당 가설이 맞는지 실험하는 방식이다.

이미지를 연산의 결과로 사용하기

그냥 디버깅 정보를 연산의 결과로 출력하는 방법이 있다. 만약 내 생각이 맞다면, 이 픽셀은 빨간색으로 만들어줘, 같은 식이다.

디버거 사용하기

어떤 상황이 발생할 때, 일부러 trap을 발생시키는 방법이다. 즉, 의도적으로 프로그램을 크래시 나게 만드는 것이다. 이러면 디버거가 해당 부분을 잡아줄테니 말이다.

필자: 물론 GPU 쉐이더라면 이건 NVIDIA Nsight Aftermath 같은 거 없으면 힘들다…

디버깅을 위한 자료 시각화

자료가 무슨 의미인지 이해하기 위해 자료를 보기 좋게 시각화를 하는 방법이다.