본문 바로가기

전체 글238

[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.
[ShaderLab] NPR - 2Pass, Fresnel ■ PR, NPR 앞서 공부했던 Standard, Lambert, Blinn-Phong의 공통점은 실사와 비슷하게 표현하려고 하는 것이다. 이와 같은 렌더링 방식을 PR(Photo Realistic)이라고 한다. 이와 반대로, 전혀 사실적이지 않은 렌더링 시도가 있는데 대표적으로 셀 쉐이더 (Cell Shader or Toon Shader)가 있고 이러한 방식을 NPR(Non-Photo Realistic)이라고 한다. ■ 외곽선 만드는 방법 대표적으로 아래와 같이 두 가지가 있다. (1) 2Pass를 이용한 외곽선 제작 (2) Fresnel을 이용한 외곽선 제작 구분 특징 장점 단점 2Pass 이용 먼저 Pass란 '한 번 그리는 것'을 뜻한다.그러므로 2Pass는 두 번 그린다는 뜻이다. (1) 완전히.. 2024. 3. 4.
[ShaderLab] Blinn-Phong, Gloss Map, Fake Specular ■ Blinn-Phong 여러 가지 스페큘러 표현 공식 중 가장 유명하고 전통적인 방식이다. 기본 원리는 '내가 바라보는 방향으로부터 반사되는 방향에 조명이 있으면 그 부분의 하이라이트가 가장 높다'이다. 보통 하이라이트를 표현하는 공식은 매우 유명한 Phong공식이 사용된다. Phong 공식은 반사 벡터와 조명 벡터의 내적으로 스페큘러를 표현하는 방식이다. 공식은 R(반사벡터) = 2N(L · N) - L 이다. 이러한 Phong 공식을 간략화한 것이 Blinn-Phong 공식이다. BlinnPhong은 '시선 벡터와 조명 벡터의 중간값인 하프 벡터(Half Vector)를 구하고 이를 노멀 벡터와 내적' 하는 것이다. 공식은 H · N 이다. 하프벡터를 구하는 방법은 시선벡터와 조명벡터를 더해주면 된.. 2024. 3. 3.
[ShaderLab] Rim Light, Hologram ■ Fresnel (프레넬), Rim Light (림라이트) 우리 주변을 자세히 살펴보면 모든 물체는 기울어질수록 반사가 심해진다는 것을 느낄 수 있다. 실제로 모든 물체는 길우기가 심할수록 반사가 되며 그 반사율은 재질에 따라 크게 달라진다. 이와 같이 재질과 각도에 따라 빛이 반사되는 세기가 달라지는 현상을 프레넬(Fresnel) 현상이라고 한다. 역광을 예로, 털이나 반투명 재질의 물체들은 이 현상이 강렬하게 나타날 수 있고 재질에 따라 때로는 잘 보이지 않게 나타날 수도 있다. 이러한 역광으로 오브젝트의 외곽이 빛나보이는 듯한 현상을 림라이트(Rim Light)라고한다. ■ Fresnel 공식 구현 먼저 우리가 엔진에 내장되어 받을 수 있는 변수 중 viewDir인 뷰벡터 [카메라 벡터]를 얻어온.. 2024. 3. 3.
[ShaderLab] (Half) Lambert Light ■ 커스텀 라이트 (Custom Light) 이전까지 스니핏(snippet)에 #pragma surface surf Standard 와 같이 'Standard'라는 지시어로 어떠한 라이트 구조를 사용하는지 명시했었다. 여기에는 Lambert, BlinnPhong, Standard의 키워드가 대표적으로 들어갔는데 이들을 제외하고 커스터마이징한 라이팅 구조를 쓰고싶다면 아래와 같이 고쳐주면 된다. surf 뒤에 CustomLight라는 키워드를 추가해줬다. 이름은 아무렇게나 지어도 된다. void surf 함수 아래 float4를 반환하는 LightingCustomLight함수가 보일 것이다. CustomLight함수 이전에 'Lighting'키워드가 중요하다. 이는 surf함수 이후에 Light 함수를 정.. 2024. 3. 2.
[ShaderLab] AO(Ambient Occlusion), Vertex Color 활용2 ■ AO (Ambient Occlusion; 환경차폐) 보통 대부분의 사물, 공간들은 주변광(Ambient Light)으로 인하여 빛이 닿지 않는 공간도 밝아지는 경향이 있다. 이렇게 환경광이 가득한 공간에서 매우 구석져 있거나 복잡한 물체들로 가려져서 환경광도 닿지 못하는 부분은 더욱 어두워지는데 이 부분을 Ambient Occlusion라고 부른다. (예시. 출처: 유니티 공식문서) (코드) Occlusion은 개별 uv를 받으면 에러를 뱉어내므로 위와 같이 기존에 사용하고있는 텍스처의 uv를 가져다 사용해야한다. 그리고 일반적으로 Occlusion은 float값을 받지만 위와 같이 float4를 반환하는 tex2D사용 시 여러 채널 중 r 채널만 사용하고 나머지는 내부적으로 버린다고한다. [AO 적.. 2024. 2. 28.