티스토리 뷰
알파를 표현할 수 있는 쉐이더 코드
Shader "Custom/CustomAlphaBlendingShader" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
//Transparent는 '투명한'을 의미한다. 그러니까 Tag가 Transparent라면 투명한 객체를 그리는데 사용하는 것이다.
//Queue는 렌더링을 할 순서를 결정하는 Tag로써,
//Transparent에는 3000이라는 값이 포함되어있다.
//가장 기본적인 Geometry(2000), 가장 마지막에 그리는 Overlay(4000) 사이의 값이다.
//따라서 "Queue" = "Transparent" 라면 불투명 객체 다음, 오버레이 객체 이전에 그려지는 것이다.
Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
//alpha:fade 추가하여 Alpha를 활성화한다.
CGPROGRAM
#pragma surface surf Lambert alpha:fade
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
//Lambert 쉐이더는 SurfaceOutput 구조체를 사용해야한다.
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
뒷 면을 그릴 수 있는, 그러나 그림자는 그리지 않는 쉐이더 코드
Shader "Custom/CustomAlphaBlendingShader" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
//cull은 그리는 것을 '배제'함을 의미한다.
//쉐이더의 기본은 'cull back'으로 면의 뒷면을 그리지 않고 배제한다는 의미이기 때문에 유니티에선 기본적으로 메쉬의 뒷면을 그리지 않는다.
//여기서 'cull off'는 특정 면을 그리지 않는 작업을 off 했기 때문에 두 면이 모두 그려질 것이다.
cull off
CGPROGRAM
#pragma surface surf Lambert alpha:fade
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
//FallBack 부분에 명시된 쉐이더는 상기한 코드가 작동하지 않았을 때 대신 사용할 쉐이더인 것이다.
//이 부분이 그림자의 Pass와도 연결이 되어있다는 것을 짐작할 수 있다.
//이름에 Transparent가 들어가는 쉐이더는 그림자를 그리지 않아?
FallBack "Legacy Shaders/Transparent/VertexLit"
}
필요한 기능을 추가하면 얼마든지 사용할 수 있지만,
쓸 수 있으면 써봐라 식의 알파 소팅의 문제를 고스란히 간직한 훌륭한 쉐이더이다.
'유니티 > Shader' 카테고리의 다른 글
유니티 URP Shader Training 01 (0) | 2021.06.23 |
---|---|
가려져도 보이는 쉐이더 (0) | 2021.02.01 |
알파테스팅(컷아웃)쉐이더를작성할뿐인초라한글 (0) | 2020.07.10 |
2Pass로만드는OutLineShader (0) | 2020.07.09 |
2Path를 이용한 Clean한 AlphaBlending (0) | 2020.07.09 |