대마왕님의 책 '유니티 쉐이더 스타트업'의 6부에서 나오는 불 예제를 후반부에 나오는 내용을 이용하여 업그레이드시켜본 소스입니다. 불을 표현하기 위한 이미지는 예제파일에 있는 불과 먼지를 그대로 이용하였고, 코드만 수정하여서 배경이미지와 함께 사용할 수 있는 불을 만들어 보았습니다.
6부에서 제작한 불 이미지를 그대로 사용하면 문제점이
1. 배경에 불 이미지가 적용된 Plane의 '진한 사각형 그림자'가 나타난다.
-> 전혀 불의 그림자라고 생각할 수 없는 이질적인 그림자가 생성됩니다.
2. 불이 왼쪽아래로 치우쳐져서 그려진다
3. 불의 위아래에 연산으로 인한 찌거기가 남는다
4. 불치고 너무 진하다(?)
이렇게 배경이미지와 6부의 불 이펙트를 함께 사용하면 정말 보기 이상한 현상들이 나타납니다.
이것들을 하나하나 바꿔보도록 합시다.
소스코드
Shader "Eugene/fireupgrade"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_MainTex2("Albedo2 (RGB)", 2D) = "black" {}
[Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("SrcBlend Mode", Float) = 4
[Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("DstBlend Mode", Float) = 2
}
SubShader
{
Tags { "RenderType" = "Opaque" "Queue" = "Transparent" "IgnoreProjector"="True"}
zwrite off
blend [_SrcBlend] [_DstBlend]
cull off
CGPROGRAM
#pragma surface surf nolight keepalpha noforwardadd nolightmap noambient novertexlights noshadow
sampler2D _MainTex;
sampler2D _MainTex2;
struct Input
{
float2 uv_MainTex;
float2 uv_MainTex2;
};
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 d = tex2D(_MainTex2, float2(IN.uv_MainTex2.x, IN.uv_MainTex2.y - _Time.y));
fixed4 c = tex2D(_MainTex, saturate(IN.uv_MainTex + d.r) - 0.07);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
float4 Lightingnolight(SurfaceOutput s, float3 lightDir, float atten)
{
return float4(s.Albedo,s.Alpha);
}
ENDCG
}
FallBack "Diffuse Shaders/Transparent/VertecLit"
}
이 쉐이더는 서피스 쉐이더로 작성되었는데 이펙트를 서피스 쉐이더로 작성하게되면 성능낭비가 꽤 있다고 합니다.
1. Properties
- 불 이펙트의 blend 속성을 손쉽게 변경하여 테스트하기 위해 _Srcblend와 _Dstblend를 추가하였습니다.
2. Tags ~ sampler2D 선언 전까지
- '투명한' 오브젝트처럼 처리하기 위해 다양한 옵션들을 적용하였습니다.
- 성능낭비를 줄이기 위해 쓸모없는 기능 (라이팅, 그림자 등)을 제거하였습니다.
- zwrite off로 불안전하지만 이펙트의 알파부분이 겹쳐 다른 이펙트가 가려지는 현상을 제거하였습니다.
- cull off로 이펙트가 양면으로 출력되게 설정하였습니다.
3. Tags ~ sampler2D 선언 전까지
- 연산으로 이미지의 uv값이 0~1사이의 값을 벗어나 찌꺼기가 생기는 것을 방 지하기 위해 'saturate'로 값을 0~1사이로 고정하였습니다.
- 이미지에 덧셈연산이 되어 왼쪽 아래로 밀리는 것을 막기 위해 0.07(나름 적절한값)을 넣어서 이미지의 중앙에 불 이펙트라 자리잡게 수정하였습니다. 굉장히 마음에 안드는 방법이지만 아직 다른방법을 떠오르기 힘들어서 이대로 처리하였습니다 ㅜ.
후기
- UV에 대해 생각해보았는데 제가 잘 이해를 못하고있는듯 합니다. 이번 연휴동안 이 내용을 제대로 파보겠습니다.
'유니티 > 렌더링' 카테고리의 다른 글
[유니티]모델 안에 모델 셰이더 만들기 (0) | 2020.12.27 |
---|---|
[VFX그래프]노드 - Polar to Rectangular (0) | 2020.12.25 |
[유니티셰이더]유니티 Surface Shader 작성 메뉴얼 (0) | 2020.12.25 |
[유니티셰이더]홀로그램 + VCMask (0) | 2020.12.25 |