22a7c668e2db3e8650bbd58b36837d65eef8d95e




3bae8168f5dc3f8650bbd58b368075693b

각 픽셀마다 UV 좌표를 받음.


UV좌표를 화면 중심을 기준으로 변환 -> 0.0이 되도록 좌표 조정


시간 변수 설정으로 쉐이더에서 애니메이션 효과를 주기 위해서 _Time.y를 사용



3bae8268f5dc3f8650bbd58b3683776f85


관측자 위치 설정(ro)

->가상의 카메라(엔진에서는 카메라)의 위치 설정


ro=(0,0,time)


여기에 sin 파형을 더해서 애니메이션을 만듬



3bae8368f5dc3f8650bbd58b3680726449

카메라 위치에 임의의 displacement(변위) 적용


변위를 적용해서


ro_xy+=위치xdspAmp


dspAmp는 임의로 저장된 스케일링 계수



3bae8468f5dc3f8650bbd58b3685726dec

관측자의 타켓 계산


카메라의 오른쪽 및 위쪽 벡터를 정함(즉 관측의 방향을 정리, 이를 통해서 중심에서 패턴을 발산하는 모양을 어떻게 관측할 것인가를 보기 위해서)



3bae8568f5dc3f8650bbd58b36837065fc

빛방향(Ray direction, 빛 방향) 방향 계산 회전 적용


픽셀에 대한 광선 적용 및, 광선에 회전 적용


여기서 Rotation Matrix는


3bae8668f5dc3f8650bbd58b3682736d9d

다음을 사용



3bae8768f5dc3f8650bbd58b3686746f

이후 Ray marching 기법을 이용해서 구름을 그림

1.픽셀에 대해서 관측자에 대해서 시작하는 ray를 발사하고,

2.거리장 Signed Distance Field)를 사용해서

3.거리함수를 통함 표면과 볼륨을 계산

4.광선이 물체와 충돌하지 않을때, 광선을 거리 함수가 반환한 거리 만큼 보냄

5. 광선이 물체에 매우 가까워져 최대 이동 횟수를 초과할 경우 렌더링 중단. 충돌에 발생한 지점에 effect계산


3bae8868f5dc3f8650bbd58b3683746806bd

광선 마칭을 위한 초기 거리와 안개 변수

t=1.5

fogT=0.0


광선 마칭은 130회까지 반복되고, 누적 투명도가 0.99이상일 경우 중단되게 설정


3bae8968f5dc3f8650bbd58b3684776e

현재 위치 계산


이후에 ComputeDensity 함수를 사용, 현재 위치에서의 밀도계산



3bae8177abc236a14e81d2b628f1756dbaa6


누적 색상

1.계산된 색상과 투명도를 누적시킴

2.거리를 업데이트하여 거리를 재설정함



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=24b0d769e1d32ca73de886fa11d02831fdb1643214b32d9bb1b5ab3e59bc89b2acde09dfc5111ccc55e41eee5314de0d1b754d47e4c2b62f0acc75a3a78ba032bdcef9cb553a

밀도 계산 함수 내부에서 노이즈 패턴 생성


밀도 계산


->여기서 반복을 통해서 밀도 계산->작은 노이즈를 겹치고 큰 패턴을 만들어서 프랙탈 노이즈를 생성함.

여기서 임의의 프랙탈 노이즈 매트릭스를 삽입함.


3bae8174abc236a14e81d2b628f17d68da


이후 감마 보정 및 비네팅 효과를 준다.

(화면의 edge로 갈 수록 어두워지는 효과)