본문 바로가기
728x90

cg19

[ShadeLab] Triplanar ■ 이슈 다이내믹하게 지형을 생성하면 아래와 같은 문제가 발생할 수 있다. 옆면이 찌그러진 상태로 늘어나는 현상인데 하나의 uv를 갖고 모든 면이 사용하고 있기 때문이다. 각각의 앞면, 뒷면, 옆면, 윗면 uv를 갖고 있으면 위와 같이 지형이 생성된다해도 찌그러지는 현상은 없어질 것이다. 왜 xz냐면 위에서 봤을 때 아래와 같이 U(가로)V(세로)에 대응되는 것이 xz이기 때문이다. [World Position을 uv로 활용했을때 GIF] 월드포지션 xz에 대응되는 텍스처의 uv좌표를 가져다 사용하기 때문에 월드포지션에 따라 텍스처의 모습이 바뀌는 것 이를 윗면 뿐만이 아니라 앞면, 옆면에 모두 사용해야한다. 위 Front와 Side면을 본다면 각각 uv에다가 월드좌표의 xy, zy를 대입해야함을 알 수.. 2024. 3. 11.
[ShaderLab] Water ■ 물 쉐이더 평면(Plane)을 여러개 깔아놓고 스카이박스가 반사되도록 쉐이더를 작성했다. 물보다는 수은 덩어리 같아서 알파값을 추가했고 프레넬효과를 주기 위해 앞서 배운 림라이트를 추가하였다. 이제 조금씩 움직이도록 설정했다. 노말 한 개를 두 번 다른 방향으로 시간의 흐름에 따라 움직이도록 언팩하여 이들의 평균값을 노말에 대입했다. [GIF] 이제 물에 햇빛이 반사되어보이도록 스페큘러를 추가했다. 이제 바다가 역동적으로 움직일려면 버텍스 쉐이더(vertex shader) 부분을 건드려야한다. sin 그래프와 비슷한 모양을 가질 수 있도록 의도했다. 아래 사진을 보면 y=sinx 그래프가 파도의 모습과 비슷하다는 것을 볼 수 있다. *2-1 연산으로 0~1의 범위를 -1 ~ 1의 범위로 만들어준 뒤 .. 2024. 3. 11.
[ShaderLab] Refraction ■ 굴절 (Refraction) 먼저 굴절 영역이 되어줄 quad 오브젝 하나를 배치해줬다. 해당 오브젝트의 쉐이더는 GrabPass{} 내용이 추가될 것이다. GrabPass란 화면을 캡처하는 내용이라 생각하면 된다. 이는 sampler2D _GrabTexture에 저장이 될 것이고 현재 화면의 UV 값을 가진 Input 구조체의 내장된 변수 screePos를 사용할 것이다. 일단 스크린 좌표계가 필요하기 때문에 UV가 정상적으로 입력되는지 확인해봐야 한다. screen UV가 카메라의 거리에 따른 영향을 받지 않도록 rgb/a 처리를 해줬다. 이제 uv가 정상적으로 처리되는 것을 확인했으니 이를 갖고 굴절에 적용해보겠다. 다른 오브젝트들보다 나중에 그려져야 배경을 캡쳐할 수 있으므로 Transpare.. 2024. 3. 10.
[ShaderLab] Matcap ■ Matcap이란? Matcap이란 Material Capture의 준말. Ramp Texture와 같이 이미지로 조명을 대신 사용하는 방식 [IBL; Image Based Lighting]이다. 최적화를 많이 신경써야하는 모바일에서 자주 사용하는 Fake Lighting 기법이다. 라이트를 전혀 사용하지 않고도 조명을 내는 효과를 낼 수 있다. ■ 구현 먼저 월드 좌표계 노말을 활용해 라이팅 없이 각 버텍스의 컬러를 조절해주는 설정을 해보겠다. 빛의 영향을 받지 않는 Emission에 월드노말을 대입했을 때 위와 같은 모습을 띈다. 하지만 카메라의 방향과 각도에 따라 달라지게 할려면 아래와 같이 뷰 좌표계를 기준으로 노말을 계산해줘야한다. View Matrix (뷰 행렬)을 월드 노말에 곱함으로써 뷰.. 2024. 3. 10.
[ShaderLab] Dissolve ■ Dissolve 소멸 효과를 줄 때 많이 사용하는 쉐이더 기법. Unity C#에 있는 Mathf 클래스의 Pingpong이 Shaderlab에는 없어서 어떻게 구현할지 고민 후 내장된 변수 시간(Time)에 따라 사라졌다가 다시 생기도록 설정해봤다. [1st Pass: 몸속 내부가 보이지 않도록 설정] [2nd Pass: 몸 외부가 사라졌다가 다시 생겨나는 dissovle 효과] [완성된 모습] 그냥 보기엔 밋밋하다. 사라지는 구간의 외곽에 색깔을 더하겠다. 프로퍼티로 Color와 Thickness를 추가했고 Color같은 경우 0~1범위를 벗어나는 색깔을 표현하고자 [HDR] 키워드를 추가했다. HDR을 사용하려면 그래픽세팅에 Use HDR이 체크되어있어야하고 Quality 옵션에서 Anti-Al.. 2024. 3. 6.
[ShaderLab] 2Pass AlphaBlending ■ 응용 이전에 배운 2Pass와 AlphaBlending을 응용한 것이다. 만약 반투명처리를 한다면 캐릭터 내부에 뼈라든지 관절이라든지 다 보일 것이다. 의도한 것이 아니라면 원래 보통 생각하는 반투명은 피부만 보이는 상태에서 알파값이 0.5가 되는 것이다. ▼ 그냥 처리한다면 아래와 같이 몸통 내부가 다 보인다. [해결방법] 이를 해결하기 위해서는 Two Pass 기법과 Alpha Blending 기법을 혼용해야한다. RenderType과 Queue는 그대로 Transparent로 지정해주고 첫번째로 그려줄 1st Pass는 'zwrite on'과 'ColorMask 0'을 설정해준다. zwrite on은 뎁스 버퍼의 콘텐츠를 사용하겠다는 것인데 쉽게 말해 앞서 배운 Z Buffering을 사용하겠다.. 2024. 3. 6.
[ShaderLab] 알파 블렌딩 (Alpha Blending) ■ Alpha Blending 기본적으로 게임 오브젝트들은 렌더링파이프라인을 통해 화면에 그려지게 되는데 Output Merger 단계에서 z-buffering을 통해 여러 사물의 렌더링 순서를 결정해준다. 이렇게 불투명한 오브젝트들은 z-buffering을 통해 그려준다면 별 문제가 없는데 반투명 물체를 그려줄 때는 문제가 생길 수 있다. 뒤에있는 불투명한 오브젝트를 먼저 그려주고 앞에 있는 반투명한 오브젝트를 그려준다면 문제 없이 렌더링 된다. 하지만, 앞에있는 반투명 오브젝트가 그려지고 뒤에 있는 불투명한 오브젝트를 그려준다면 반투명 오브젝트가 그려지면서 z버퍼에 정보를 넘겨주게되어 뒤에 위치한 불투명한 오브젝트의 일부분이 잘리게 된다. 반투명한 물체가 아니라 하나의 Quad에 알파값을 갖고있는 텍.. 2024. 3. 6.
[ShaderLab] Cubemap (with MaskMap) ■ CubeMap 리얼타임으로 반사(Reflection) 렌더링을 하는 것은 매우 무겁다. 그래서 많이 사용하는 방식은 CubeMap(큐브맵)이라는 환경 텍스처를 이용해 주변 이미지를 텍스처로 만든 뒤 오브젝트에 씌우는 것이 있다. 먼저 아래와 같이 cubemap을 만들어줬다. 고화질의 텍스처의 설정 모습이다. 위에서 만든 Cubemap을 아래 쉐이더 코드를 작성한 뒤 삽입해주면 된다. 그러면 해당 쉐이더를 적용받고있는 오브젝트가 마치 skybox의 전경을 반사하고 있는 것처럼 보인다. 여기에 디테일함을 추가하기 위해 노말맵을 추가할려고했다. 일반적인 노말 적용 방식으로 하려고한다면 아래와 같이 에러가 검출된다. 위와 같은 에러가 발생하는 이유는 Surface Shader의 Input 구조체에 내포되어있.. 2024. 3. 5.
[ShaderLab] Diffuse Warping ■ Diffuse Warping Valve 사에서 발표한 그래픽스 관련 논문에 소개된 기법이다. Warp Diffuse 혹은 Ramp Texture라고도 불린다. 이 기법은 빛 계산으로 쓰이는 공식인 노말과 라이트 벡터의 내적을 uv에 대응하는 기술이다. 아래 코드를 확인해야한다. 텍스처의 좌하단을 기준으로 (0, 0)부터 시작한다. 가로축은 u 세로축은 v. 위 코드 속 ramp 텍스처를 uv에 대응시키는 구간을 보면 RamTexture의 y축은 0.5를 고정하고 x축은 서서히 ndotl의 값에 따라 0~1사이의 값을 가져다 사용하도록 작성하였다. 이의 결과물은 아래와 같다. 이제 노말맵과 메인텍스처의 알베도 값을 혼용하여 적용해보겠다. 그럴싸해졌다. 여기서 앞서 배운 Half Vector와 노말의 내.. 2024. 3. 5.
728x90