-
Vertex Color Masking유니티/게임그래픽 2024. 2. 21. 14:18
이번엔 Vertex Color를 마스킹으로 이용하여 멀티 텍스쳐 기능을 만들어보겠다
Shader "Custom/NewSurfaceShader" { Properties { _MainTex ("MainTex", 2D) = "white" {} _MainTex2 ("MainTex", 2D) = "white" {} _MainTex3 ("MainTex", 2D) = "white" {} _MainTex4 ("MainTex", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Standard sampler2D _MainTex; sampler2D _MainTex2; sampler2D _MainTex3; sampler2D _MainTex4; struct Input { float2 uv_MainTex; float2 uv_MainTex2; float2 uv_MainTex3; float2 uv_MainTex4; float4 color:COLOR; }; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 c = tex2D(_MainTex, IN.uv_MainTex); fixed4 d = tex2D(_MainTex2, IN.uv_MainTex2); fixed4 e = tex2D(_MainTex3, IN.uv_MainTex3); fixed4 f = tex2D(_MainTex4, IN.uv_MainTex4); o.Emission = IN.color.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
우선 텍스쳐 4개를 입력받아 우선은 Vertex color를 출력하는 스크립트를 짜준다
o.Emission = IN.color.r;
만약 여기서 R채널만 출력하면 흑백으로 변하고 R영역만 흰색으로 출력된다 (물론 G나 B도 마찬가지)
이제 전에 배웠던 lerp함수를 이용해 텍스쳐들을 한번 섞어보자
o.Emission = lerp(c.rgb, d.rgb, IN.color.r);
lerp를 이용하여 텍스쳐 c와 d를 color의 r값의 비율만큼 섞어준다
그럼 R의 영역에 텍스쳐 d가 섞인 모습을 볼 수 있다
이렇게 하나 섞었으니 이번엔 G와 B의 영역도 동시에 섞이도록 코드를 짜보겠다
o.Emission = lerp(c.rgb, d.rgb, IN.color.r); o.Emission = lerp(c.rgb, e.rgb, IN.color.g); o.Emission = lerp(c.rgb, f.rgb, IN.color.b);
처음엔 단순하게 생각해서 이렇게 하면 될줄 알았다. 하지만 이렇게 만드니
마지막줄에 적은 f값만 출력된다. 이렇듯 출력코드 3줄을 적으면 그 3줄을 전부 출력해주는것이 아니라
마지막 1줄만 출력한다는것을 알 수 있다
o.Emission = lerp(c.rgb, d.rgb, IN.color.r); o.Emission = lerp(o.Emission, e.rgb, IN.color.g); o.Emission = lerp(o.Emission, f.rgb, IN.color.b);
결국 마지막 한줄만 적용되는거라면 첫번째, 두번째 o.Emission을 그대로 끌고와 마지막 줄에 적어주면 된다
'유니티 > 게임그래픽' 카테고리의 다른 글
NormalMap (0) 2024.02.21 SurfaceOutputStandard(Metallic & Smoothness) (0) 2024.02.21 Vertex Color (1) 2024.02.21 _Time 변수 스크립트 기본형 (0) 2024.02.20 불 이펙트 (1) 2024.02.20