<aside> ⁉️ 궁금한 내용, 오타, 수정사항, 문의사항은 아래 깃허브 이슈 혹은 노션 블록 댓글로 달아주시면 바로 확인해드립니다! 도움이 되셨다면 아래 링크를 통해 🌟 한번 꾹 눌러주세요 ‼️

</aside>

GaepoMorningEagles/mini_raytracing_in_c


1. RGB and PPM

제일 처음 알아볼 것은 렌더링 프로그램의 결과를 확인할 PPM파일과, 색상을 표현할 RGB형식이다.

1.1. 실습 목표

rgb 그라데이션 이미지를 ppm파일로 생성.목표 산출물 :이미지1: 그라데이션 이미지

https://camo.githubusercontent.com/722abb8af6477e139a0ad80a35134c6aadab1bf665d5568037e7c1fe8edbb4e9/68747470733a2f2f72617974726163696e672e6769746875622e696f2f696d616765732f696d672d312e30312d66697273742d70706d2d696d6167652e706e67

1.2.PPM 이미지 파일 포맷

이미지2: ppm 파일 형식

https://camo.githubusercontent.com/16aee6dc00862ddba1617791c65913d20d666aace3991707c095c3b56be2d2a2/68747470733a2f2f72617974726163696e672e6769746875622e696f2f696d616765732f6669672d312e30312d70706d2e6a7067

우리는 렌더링 프로그램을 만들 것이다. 렌더링 프로그램의 결과물은 이미지이다. 프로그램이 잘 작성됐는지 확인하려면 렌더링의 결과인 이미지 파일을 확인하면 된다. 우리는 ppm 형식의 파일을 통해 렌더링 된 이미지를 확인할 것이다. ppm은 jpg나 png, bmp와 같이 그래픽 파일의 형식 중 하나이다.(자세한 내용은 위키피디아 참고.) ppm파일의 구성은 이미지2와 같다. 첫 번째 줄의 P3은 아스키코드로 표현한 RGB를 통해 이미지를 표현함을 의미하고, 네 번째 줄의 3 2는 가로와 세로의 픽셀 수를 나타낸다. 다섯 번째 줄의 255는 R,G,B 각 색의 최대값을 의미한다. 그 다음부터 나오는 255 0 0과 같은 숫자(정수)는 왼쪽 위부터 오른쪽으로 각 픽셀에 들어가는 R G B 값에 대한 정보이다.

이미지2와 같이 작성한 ppm 파일을 실행한 결과는 이미지2의 오른쪽에 위치한 그림이다. ppm파일의 6번째 줄 첫 번째 순서쌍(255 0 0 ;순서대로 R G B)에 해당하는 값이 그림의 왼쪽 위 픽셀에 표현되어 있음을 알 수 있다.

1.3.RGB Color

이미지 2의 PPM 파일에서 설정한 RGB 값의 범위는 0부터 255사이의 정수이다. 하지만 실습에서는 범위를 0부터 1사이의 실수로 매핑하여 색상값을 구한 뒤, 다시 0부터 255 사이의 정수로 변환하여 출력할 것이다. 범위를 매핑하는 이유는 다음과 같다. 첫째, 벡터 연산의 용이하게 하기 위해. 둘째, 색상 범위의 확장성을 위해. 셋째, 물리학적인 의미를 고려했을 때 [0, 1]로 매핑하는 것이 더 적합하기 때문에. 자세한 이유는 교재를 따라가다 보면 자연스럽게 알게 될 것이다. 세 번째 이유에 대해 조금 더 생각해보자. 왜 사과는 빨간 색으로 보일까? 그것은 사과가 가시광선 중 빨간색을 반사하기 때문이다. 물체의 색깔은 물체의 표면이 가시광선을 어떻게 반사하는지에 따라 달라진다. 물체가 빛을 반사하는 정도를 알베도(albedo, 반사율)라고 하고, 알베도는 0부터 1 사이의 값을 갖는다. 우리가 빨간 구를 표현하고 싶다면, 빨간색을 많이 반사하게끔 설정해주면 되는 것이다.

1.4.그라데이션 이미지 만들기

#include <stdio.h>

int	main(void)
{
	int		i;
	int		j;
	double	r;
	double	g;
	double	b;
	int		canvas_width;
	int		canvas_height;

	//캔버스의 가로, 세로 픽셀값
	canvas_width = 256;
	canvas_height = 256;

	// 랜더링
	// P3 는 색상값이 아스키코드라는 뜻, 그리고 다음 줄은 캔버스의 가로, 세로 픽셀 수, 마지막은 사용할 색상값
	printf("P3\\n%d %d\\n255\\n", canvas_width, canvas_height);
	j = canvas_height - 1;
	while (j >= 0)
	{
		i = 0;
		while (i < canvas_width)
		{
			r = (double)i / (canvas_width - 1);
			g = (double)j / (canvas_height - 1);
			b = 0.25;
			printf("%d %d %d\\n", (int)(255.999 * r), (int)(255.999 * g), (int)(255.999 * b));
		++i;
		}
	--j;
	}
	return (0);
}

Code1 : [/src/main.c]

gcc main.c으로 컴파일 후 a.out > rgb.ppm