(RayTracing) 안티앨리어싱
현실의 카메라로 찍은 사진은 아래 이미지 처럼 계단현상은 거의 보이지 않을 것 입니다. 사진은 픽셀이 물체와 배경이 섞이기 때문입니다. 저희도 픽셀을 샘플링한 후 평균을 내는 것으로 비슷한 효과를 만들어 낼 수 있습니다.
랜덤 유틸리티
일반적인 범위인 $0 \leq r < 1$에서 실수를 반환하는 랜덤 생성기가 필요합니다. “1보다 작다”라는 점은 몇가지 이점이 있기 때문에 중요합니다.
저는 하스켈의 random 패키지의 RandomGen instance와 randomR 함수를 사용합니다.
샘플링으로 픽셀 생성
한 픽셀에 $n_s$개 만큼의 무작위 광선을 쏴 결과를 평균냅니다.
아래는 샘플링...
(RayTracing) 법선 셰이딩과 Hittable 추상화
법선으로 셰이딩 만들어보기
이제 물체의 여부 뿐만 아니라, 셰이딩을 적용해봅시다. 아직 빛이나 다른 요소를 추가하지 않았으니, 법선(normal vector)을 색으로 표현합니다. 법선은 교점에서 수직입니다. 외향법선(outward normal)은 구의 중심에서 접점을 뺀 방향을 가집니다. 법선을 만들때 두가지 고려사항이 있습니다.
첫번째 고려사항은 단위 법선 벡터입니다. 셰이딩에서 단위벡터를 사용하는 관습이 있긴하지만, 코드에 꼭 적용해야 하는 것은 아닙니다. 대부분의 구조가 그렇듯 개인의 자유를 따릅니다.
법선벡터 → 단위벡터 → 0~1 → normalize → x/y/z ⇒ r/g/b 순서로 변환합...
(RayTracing) 구 그리기
레이트레이서에 이제 물체 하나를 추가해봅시다. 광선이 구에 부딪혀 다양한 각도로 반사되기 때문에 레이트레이싱 예제에 적합합니다.
광선-구 교점
반지름이 R이고 원점이 중심인 구의 방정식은 $x^2 + y^2 + z^2 = R^2$입니다. 바꿔말해서
점 $(x, y, z)$가 구 위: $x^2 + y^2 + z^2 = R^2$
점 $(x, y, z)$가 구 안: $x^2 + y^2 + z^2 < R^2$
점 $(x, y, z)$가 구 밖: $x^2 + y^2 + z^2 > R^2$
구의 중심이 $(C_x, C_y, C_z)$ 일때 방정식:
\[(x - C_x)^2 + (y - C_y...
(RayTracing) Ray, 카메라, 배경
레이트레이서는 광선를 따라가 픽셀의 색을 추정합니다. 광선을 함수로 생각해보면 $P(t) = A + tB$입니다. P는 3D 공간에서 선을 그리는 1차 방정식이고, A는 원점, B는 방향, 실수 t는 광선의 변수입니다. 변수 t에 따라 P(t)는 직선 위의 점을 움직입니다. t를 양수로 두면, A의 앞으로만 직진할 수 있습니다. 이를 반직선 혹은 광선이라고 부릅니다.
함수 P(t)는 코드에서 at ray t 로 표현합니다.
module Ray where
import Vector
data Ray =
Ray
{ origin :: Point
, direction ::...
(RayTracing) Vec3 클래스
거의 모든 그래픽스 프로그램은 벡터와 컬러 클래스를 가지고 있습니다. 많은 시스템들이 4D(3D에 homogeneous coordinate를 더한 기하와 RGB에 alpha를 추가한 컬러)입니다. 강의의 목적으로는 3D 좌표계만으로도 충분합니다. 저희는 vec3 클래스로 컬러, 위치, 방향, 좌표 등등 여러 방도로 사용할겁니다. 몇몇 분들은 이 구조가 맘에 안들 수도 있습니다. location에 color를 더한다던가 말이죠. 좋은 지적입니다만, 저희는 틀리지 않다면 “적은 코드”로 진행하기를 중점에 두고 있습니다. 저희는 vec3 의 alias인 point3, color 를 선언합니다. 두 타입이 vec3 의 a...
(RayTracing) 간단한 이미지 만들기
PPM 이미지 형식
렌더러를 처음 만든다면, 이미지를 보여줄 방법이 필요합니다. 가장 간단한 방법은 파일로 저장하는 겁니다. 이미지 파일은 많은 형식이 있고, 복잡한 포맷인 경우도 많습니다. 여기서는 이미지를 만드는 가장 쉬운 방법인 text 만을 가지고 이미지를 만들 수 있는 ppm 형식으로 시작합니다. 자세한 것은 위키를 참고하세요
저는 하스켈로 간단히 만들어 봤습니다.
module Main where
import qualified Data.ByteString.Char8 as C
data Color a =
Color
{ red :: a
, green :: a
, blue...
(RayTracing) Intro
이 강의를 진행하는 피터 교수님은 수년동안 많은 그래픽스 강의를 해오셨습니다. 레이트레이싱(ray tracing)은 API 없이도 그래픽스 이미지를 만드는 것이 가능합니다. 강의은 빠르고 멋진 프로그램을 만드는 것에 중점을 둡니다.
“레이 트레이싱”은 다양한 의미를 가집니다. 여기서 언급되는 것은 엄밀히 “패스 트레이서”입니다. 교수님는 C++로 개발하지만, 따라야할 필요는 없습니다. 하지만 빠르고, 간단하며, 대부분은 C++로 작성된 렌더러를 사용한다는 점에서 추천합니다. 저는 언어를 haskell로 개발하며, 언어를 익히기 위함을 목적으로 했습니다.
이 강의는 벡터 연산(dot product, vector ...
82 post articles, 11 pages.