2. Output an Image(이미지 출력)

2.1 The PPM Image Format(PPM 이미지 형식)

렌더러를 시작할 때마다 이미지를 볼 수 있는 방법이 필요합니다. 가장 간단한 방법은 파일에 작성하는 것입니다. 문제는 형식이 너무 많다는 것입니다. 그 중 많은 것들이 복잡합니다. 저는 항상 평문 ppm 파일로 시작합니다. 다음은 Wikipedia의 좋은 설명입니다:

그림 1: PPM 예제

이러한 것을 출력하는 C++ 코드를 만들어 봅시다:

#include <iostream>

int main()
{
    // Image
    int ImageWidth = 256;
    int ImageHeight = 256;

    // Render
    std::cout << "P3\\n" << ImageWidth << ' ' << ImageHeight << "\\n255\\n";

    for (int j = 0; j < ImageHeight; j++) 
    {
        for (int i = 0; i < ImageWidth; i++) 
        {
            auto r = double(i) / (ImageWidth - 1);
            auto g = double(j) / (ImageHeight - 1);
            auto b = 0.0;

            int ir = int(255.999 * r);
            int ig = int(255.999 * g);
            int ib = int(255.999 * b);

            std::cout << ir << ' ' << ig << ' ' << ib << '\\n';
        }
    }
    
    return 0;
}

리스트 1: [main.cc] 첫 번째 이미지 생성

이 코드에서 주목해야 할 몇 가지 사항이 있습니다:

  1. 픽셀은 행 단위로 작성됩니다.
  2. 각 픽셀 행은 왼쪽에서 오른쪽으로 작성됩니다.
  3. 이러한 행들은 위에서 아래로 작성됩니다.
  4. 관례적으로 각 빨강/녹색/파랑 구성 요소는 내부적으로 0.0에서 1.0 범위의 실수 값 변수로 표현됩니다. 이들을 출력하기 전에 0에서 255 사이의 정수 값으로 스케일링해야 합니다.
  5. 빨강은 왼쪽에서 오른쪽으로 완전히 꺼진 상태(검정)에서 완전히 켜진 상태(밝은 빨강)로 변하고, 녹색은 위쪽에서 완전히 꺼진 상태(검정)에서 아래쪽에서 완전히 켜진 상태(밝은 녹색)로 변합니다. 빨강과 녹색 빛을 함께 더하면 노란색이 되므로 오른쪽 아래 모서리는 노란색이어야 합니다.

2.2 Creating an Image File(이미지 파일 생성)

파일이 표준 출력 스트림에 작성되기 때문에 이를 이미지 파일로 리디렉션해야 합니다. 일반적으로 이는 명령줄에서 리디렉션 연산자를 사용하여 수행됩니다.

우리는 기존 레이트레이싱 환경과 다르게 window환경에서 visual studio community IDE 를 이용하여 빌드할 예정입니다. 이예제가 작성된 시점에는 2022 버전을 사용 하였고 추후 2026이 쿠다 커널을 지원해줄때 언제든지 마이그레이션을 진행해도 좋습니다.

그런 다음 새로 빌드한 프로그램을 다음과 같이 실행합니다: 이는 이미지 뷰어로 볼수 있는 ppm 파일로 바꿔줍니다.

build\\Debug\\inOneWeekend.exe > image.ppm