Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
관리 메뉴

일상

Fresnel Coefficient 적용해보기 -02 본문

computer graphics

Fresnel Coefficient 적용해보기 -02

Mysteryu 2021. 10. 3. 22:59

이전글에서 문제를 단순화 하기 위해 기존 코드를 참고해서 ray tracer를 만들어봤다.

이번에는 저번에 한 반사, 굴절 현상을 한번에 합치기 위해 프레넬 방정식을 이용을 할 것이다.

 

프레넬 방정식을 아주 간단히 말하자면 굴절과 반사를 각각 몇퍼센트로 할지 결정하는 계수를 구하는 방정식 이라고 생각하고 있다.

 

자세한 설명은 Introduction to Shading (Reflection, Refraction and Fresnel) (scratchapixel.com) 여기를 참고하시면 될 것 같다. (그래픽스 관련 설명!)

 

여튼, 이번에는 코드를 작성하기 전에 충분히 생각을 하고 작성을 하였다.

 

간단하게 코드를 어떻게 작성할지 글로 정리를 해봤다.

 

1. 반사된 Ray를 Reculsive를 이용하여 구한다. 맨 마지막으로 리턴되는 곳의 color를 구한다.

2. 굴절된 Ray를 Reculsive를 이용하여 구한다. 맨 마지막으로 리턴되는 곳의 color를 구한다.

3. 프레넬 방정식을 이용해 계수를 구한다.

4. 1,2,3에서 구한것을 바탕으로 반사 Ray에서 얻은 color와 굴절 Ray에서 얻은 color를 프레넬 계수를 곱하여 더해준다

 

실제로는 좀 디테일하게 글로 쓰고 했지만 여튼 이런 과정을 통하여 코드를 꽤 빠르게 작성을 하였다. 

그리고 나온 결과물은..

 

프레넬 계수를 이용해 얻은 이미지

 

저번 포스팅의 마지막 이미지들에 프레넬 계수를 적용해서 얻은 이미지이다. 저번 포스트의 이미지 비교를 했을 때 좀 더 흐릿하게 반사가 된 것같다. 굴절은 별로 차이가 없는듯 하다.

 

생각보다 일이 수월하게 되어서 이번에는 Ray Tracing in One Weekend 10.5에 있는 hollow glass(속빈유리)를 만들어 보려고 하였다. 코드를 작성하고 결과물을 기대하고 있었는데..

 

 

10분.. 20분이 지나도 cmd창에 저런 글자만 계속 떠있었다. 무한루프에 걸린것같아서 뭐가 문제인지 생각을 해보고 디버깅도 해보려다 실패하고 코드도 바꿔보다가 결국 해결하지 못하고 학교 과제가 있어 과제를 하러 갔다. 

 

이후에 무엇이 문제인지 알아보기 위해 depth를 최소화하고 안티엘리어싱 효과를 배제하고 진행하였다. 

근데.. 정상적으로 이미지가 그것도 빠르게 생성되었다. 생각해보니까 원인을 추정을 할 수 있었는데

 

1. GPU가 아닌 CPU를 이용해 계산을 해 이미지를 생성한다. -> 느리다

2. 기존의 Ray Tracer는 1개의 Ray만 다뤘지만 내가 만든 Ray Tracer의 경우는 기본적으로 2개의 Ray를 다룬다.

   더구나 반사된 Ray가 다시 반사를 하게되면 Ray가 더 늘어나게 된다(추정)

 

특히 2의 경우로 인해 계산량이 너무 많아져서 마치 무한루프에 빠진것같은 현상이 나오게 된 것 같다.

예상치못하게 원인을 빨리 찾게 되어서 다행이었으나 한편으로는 아쉬운 마음이 들긴 했다. GPU를 사용을 하였다면

계산을 더 빨리 진행을 할 수 있었을텐데 나중에 GPU를 사용하거나 계산량을 줄일 수 있는 방법을 공부해봐야겠다.

 

여튼 이후에 Ray Tracing in One Weekend 10.5 까지의 소스코드로 만든 이미지와 내가 작성한 소스코드로 만든 이미지를 비교를 진행해보면 

 

위 : Ray Tracing in One Weekend / 아래 : 나
위 : Ray Tracing in One Weekend / 아래 : 나
위 : Ray Tracing in One Weekend / 아래 : 나

참고로 Ray Tracing in One Weekend에서 사용한 방법은 Schlick Approximation 이라는 방법이고 하나의 ray만 이용한다.

두 이미지를 비교하니까 밑의 이미지가 너무 허접하다는게 체감이 너무 확 된다..

그래도 프레넬 계수가 제대로 동작하는것 같아서 좋다. 내가 만든 raytracer에 Schlick Approximation을 적용을 할까 하다가 아무래도 내가 만든 이미지가 photorealistic 하지는 않다보니 정확한 비교가 되려나 싶어서 이후에 다시 해볼까 한다.

 

우선 프레넬 방정식을 이용하여 이미지를 생성하는 방법은 잠정적으로 여기서 중단할것 같다. 아무래도 photorealistic한 이미지를 만드는 것이 그래픽스의 목표이니 RayTracing in One Weekend의 다른 시리즈인 The Next Week와 시간이 된다면 C++를 더 공부해보려고 한다. 이후에 내가 만든 rayTracer를 수정해(아마 갈아엎어야겠지만) 좀 더 photorealistic한 이미지를 구현해볼 수 있도록 해야겠다.

 

나의 Ray Tracer로 직접만든 이미지를 마지막으로 포스팅을 마치겠다. 힘들긴 했지만 공부한 것을 직접 구현해볼 수 있어서 나에겐 무척이나 의미있는 시간이었다.

 

R,G,B 색상의 hollow glasses

 

 

 

'computer graphics' 카테고리의 다른 글

Cornell box 만들어보기  (0) 2021.11.06
Fresnel Coefficient 적용해보기 -03  (0) 2021.10.08
Fresnel Coefficient 적용해보기 -01  (0) 2021.09.30
프레넬 방정식 적용해보기  (0) 2021.09.30
Ray Tracing in One Weekend  (0) 2021.09.28
Comments