본문 바로가기

Shader CG31

12. RayMarching - rain and lights struct ray { vec3 o; vec3 d;};// 직선과 점이 수직으로 만났을때 지점vec3 clossestPoint(ray r, vec3 p) { return r.o + max(0., dot(p - r.o, r.d)) * r.d;}// 직선과 점과 최단 거리float DistRay(ray r, vec3 p) { return length(p - clossestPoint(r, p));}// 카메라 좌표계 구하기.ray GetRay(vec2 uv, vec3 camPos, vec3 lookat, float zoom) { ray a; a.o = camPos; vec3 f = normalize(lookat - camPos); vec3 r = cross(vec3(0,1,0), f); vec.. 2024. 8. 18.
11. RayMarching - Snow man 지금까지 공부했던 내용 바탕으로 눈사람 만들어보자. 머리와 몸통은 구 렌더링이다.머리와 몸통을 경계를 스무스하게 만드는 opSmoothUnion() 을 사용한다.눈과 입 전부 구 렌더링이라 특별한 것은 없다. 코의 경우 콘 형태이며, z 축방향으로 삐죽하게 만들기 위해 y,z 축을 교환했다.콘을 만드는 코드는 아래 사이트를 참고https://iquilezles.org/articles/distfunctions/ Inigo QuilezArticles on computer graphics, math and artiquilezles.org 눈사람 내부 컴포넌트를 전부 union 후, 컬러를 적용한다.옆에서 바라보는 효과를 위해 아래 코드를 사용했다.p.x -= 0.75; // move entire scene s.. 2024. 8. 14.
10. RayMarching - Cube map 텍스처링을 바로 샘플링 하는 방법도 있고,프레임 버퍼 생성을 할수있는데,  지원되는 이미지 버퍼가 4개를 지원하고,1개의 큐브맵 버퍼, 1개의 컴포지팅 할수 있는 버퍼 총 6개를 지원한다.버퍼를 생성하여 텍스처링 가져오는 방법은 아래 15번 챕터에 잘 나와있다.아래 레퍼런스 사이트를 참고하자. 그러면 큐브맵 텍스처링을 해본다.먼저 채널 0번 버퍼에 큐브맵을 세팅한다. 채널 0번 버퍼에 바인딩 되어있는 큐브맵 샘플링 값을 가져온다.iChannel0은 큐브맵의 samplerCube 값이고, rd는 uv 값이다.큐브맵 텍스처에 uv 좌표에 해당하는 컬러값을 가져온다.vec3 col = texture(iChannel0, rd).xyz;  코드 >>마우스 좌/우, 상/하 움직임에 따라서 카메라 시점을 이동한다.#.. 2024. 8. 13.
09. RayMarching - SD Operation 도형들의 여러가지 연산 방법들의 대해서 정의 한다. 필요할때 마다 찾아서 사용하면 좋을 듯 하다 1) 도형 1, 도형 2를 합쳐서 출력.float opUnion(float d1, float d2) { return min(d1, d2);} 2) 도형 1, 도형 2를 부드럽게 합쳐서 출력.float opSmoothUnion(float d1, float d2, float k) { float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 ); return mix( d2, d1, h ) - k*h*(1.0-h);} 3) 도형 1, 도형 2의 공통 부분만 출력float opIntersection(float d1, float d2) { return max(d1, d2);} 4) 도형.. 2024. 8. 12.