4-Solid Textures

이현기·2022년 8월 13일
0

RayTracing:The-Next-Week

목록 보기
4/9
  • 주의 사항
  1. 이 글은 RayTracing:The Next week을 공부하며 작성한 글이다.
  2. 모든 사진, 글은 RayTracing:The Next week에서 가지고 왔다.
  3. 영어 해석, 이론적으로 틀린 내용이 존재할 경우가 매우 크다. (지적해주시면 감사합니다.)
  4. 글을 쓰는 능력이 매우 안좋으니 이해해주세요. 연습 중 입니다.

이제는 컴퓨터 그래픽스에서 많이 사용되는 텍스처에 관한 이야기 이다. 그래픽스에서의 texture는 보통 표면에 색깔을 만들어주는 기능을 의미한다. 이 procedure은 synthesis code일 수도 있고 하나의 이미지가 될 수도 있고 이 두가지의 결합일 수도 있다. 우리는 첫번째로 모든 색상의 texture를 만들 것이다. 모든 프로그램들은 일정한 RGB 색상과 texture를 Class안에 가지고 있다. 그래서 우리는 모두 마음대로 사용할 수 있다.

기존에 LearnOpenGL을 공부해보면서 texture에 대한 지식을 더 쌓을 수 있다!

여기서 우리가 매우 중요하게 생각해야할 점은 texture는 (u,v)(u, v)f라는 coordinate system을 가지고 있다. \to 우리가 아는 x, y 좌표계와 비슷하면서도 조금 다르다.

Texture coordinate는 sphere에서 어떻게 쓰일까?

sphere에서 teuture coordinate는 보통 longitude, latitude를 기초로 한다. 구면 좌표계를 사용하여 Texture coordinate를 계산하는 것이다. 기호로는 (θ,ϕ)(\theta, \phi)로 사용한다.

구면 좌표계, 우리가 지구본을 볼 때 사용한 좌표라고 생각하면 편하다.

우리는 θ\thetaϕ\phi의 값을 [0,1][0, 1]사이로 mapping을 좌표계에 하고 싶을 때 우리는 (0,0)(0, 0)을 왼쪽 아래로 설정을 하고 nomalization을 통해 값을 얻는다. 수식은 아래와 같다.

u=φ2πu = \frac{\varphi}{2\pi}
v=θϕv = \frac{\theta}{\phi}

원점을 중심으로 한 unit sphere의 θ\thetaϕ\phif를 계산하기 위해서 우리는 Cartesian coordinates와 일치 시켜야 한다. 방정식은 아래와 같다.

Cartesian coordinates : 우리가 흔히 아는 X,Y로 이루어진 좌표계라고 생각!

y=cos(θ)x=cos(ϕ)sin(θ)z=sin(ϕ)sin(θ)y = -\cos(\theta) \\ x = - \cos (\phi) \sin (\theta) \\ z = \sin (\phi) \sin(\theta)

우리는 거꾸로의 상황에서도 θ\thetaϕ\phi를 구할 수도 있다. 왜냐하면 아주 사랑스러운 <cmath>가 존재하기 때문이다. atan2()를 이용할 수 있다. atan() 함수는 사인과 코사인에 비례하는 한 쌍의 숫자를 취하고 각도를 반환하는 역할을 해준다. 그래서 우리는 x와 z로 ϕ\phi를 구할 수 있다.

ϕ=atan2(z,x)\phi = atan2(z, -x)

atan2()가 return하는 값은 π-\pi부터 π\pi까지이다. 그러나 이 값들은 값을 벗어나면 다시 0으로 돌아오기 때문에 우리는 계산을 추가적으로 해주어야 한다. 우리는 uu를 0과 1사이로 만들고 싶기 때문에 아래와 같이 연산을 해주어야 한다.

atan2(a,b)=atan2(a,b)+πatan2(a, b) = atan2(-a, -b) + \pi

그리고 최종적으로 우리는 ϕ\phi를 구하기 위해서 아래와 같이 연산을 진행한다.

ϕ=atan2(z,x)+π\phi = atan2(-z, x) + \pi

그리고 θ\theta를 구하기 위해서 아래의 식을 사용한다.

θ=acos(y)\theta = acos(-y)

(u,v)(u, v) 좌표 계산은 원점을 중심으로 unit sphere에 존재하는 point를 가지고 와서 계산하는 유틸리티 함수에 의해 수행된다.

매우 어렵다... 머릿속으로 원을 그려보며 이해해보려 했지만 각도가 섞인다...
atan2()가 return하는 값은 [π:π][-\pi : \pi] 이기 때문에 안에 들어가는 input을 flip을 해주고 거기에 +π+\pi를 해줘도 기존과 같은 값이라는 것을 알려주고 있다. 그래서 데카르트 좌표계에 표시할 수 있는 것이다.

그나마 이해한 내용으로 코드를 작성해 보자. 지금까지 이해가 안된 점이 있다면 atan2() 함수에 관한 검색을 해보면 조금 더 이해하기 쉬울 것이다. (나도... 그렇게 했다..)

아직까지도 랜더링이 너무 오래걸린다. 정말 화가나지만 그래도 결과물을 보면 재밌으니 계속 해본다.

결과

  1. Spheres on checkered ground

  1. Checkered spheres

profile
안녕하세요!

0개의 댓글