2017-12-06 11 views
0

저는 정말 초보자입니다. 이것은 처음으로 하나의 모바일 게임을위한 셰이더를 작성한 것입니다.데칼 쉐이더가 장치에서 작동하지 않습니다.

   Shader "Decal" { 
      Properties { 
      _Skin("Skin (RGB)", 2D) = "white" {} 
      _Dirt("Dirt (RGBA)", 2D) = "black" {} 
      _Outfit("Outfit (RGBA)", 2D) = "black" {} 
      _Painting("Painting (RGBA)", 2D) = "black" {} 
      _Cheek("Cheek (RGBA)", 2D) = "black" {} 
      _LipStick("LipStick (RGBA)", 2D) = "black" {} 
      _Eye("Eye (RGBA)", 2D) = "black" {} 
      _EyeLid("EyeLid (RGBA)", 2D) = "black" {} 
      _ShadowHat("ShadowHat (RGBA)", 2D) = "black" {} 
      } 
      SubShader { 
      Tags { "RenderType"="Opaque" } 
      LOD 150 

      CGPROGRAM 
      #pragma surface surf Lambert noforwardadd 

      sampler2D _Skin; 
      sampler2D _Dirt; 
      sampler2D _Outfit; 
      sampler2D _Painting; 
      sampler2D _Cheek; 
      sampler2D _LipStick; 
      sampler2D _Eye; 
      sampler2D _EyeLid; 
      sampler2D _ShadowHat; 

      struct Input { 
      float2 uv_Skin; 
      }; 

      void surf (Input IN, inout SurfaceOutput o) { 
      fixed4 c = tex2D(_Skin, IN.uv_Skin); 
      fixed4 dirt = tex2D(_Dirt, IN.uv_Skin); 
      fixed4 outfit = tex2D(_Outfit, IN.uv_Skin); 
      fixed4 painting = tex2D(_Painting, IN.uv_Skin); 
      fixed4 cheek = tex2D(_Cheek, IN.uv_Skin); 
      fixed4 lipstick = tex2D(_LipStick, IN.uv_Skin); 
      fixed4 eye = tex2D(_Eye, IN.uv_Skin); 
      fixed4 eyelid = tex2D(_EyeLid, IN.uv_Skin); 
      fixed4 shadowHat = tex2D(_ShadowHat, IN.uv_Skin); 

      c.rgb = lerp (c.rgb, dirt.rgb, dirt.a); 
      c.rgb = lerp (c.rgb, outfit.rgb, outfit.a); 
      c.rgb = lerp (c.rgb, painting.rgb, painting.a); 
      c.rgb = lerp (c.rgb, cheek.rgb, cheek.a); 
      c.rgb = lerp (c.rgb, lipstick.rgb, lipstick.a); 
      c.rgb = lerp (c.rgb, eye.rgb, eye.a); 
      c.rgb = lerp (c.rgb, eyelid.rgb, eyelid.a); 
      c.rgb = lerp (c.rgb, shadowHat.rgb, shadowHat.a); 

      o.Albedo = c.rgb; 
      o.Alpha = c.a; 
      } 
      ENDCG 
      } 

      Fallback "Mobile/VertexLit" 
      } 

그래서 어떤 도움은 매우 환영합니다 :) 것, 또한 한 가지 내가이의 성능 모르겠어요, 명확히하기 위해 : 여기 잘 편집기에 있지만 내 안드로이드 장치에 대한 작업, 쉐이더입니다 셰이더는 모바일 용으로 충분합니까?

대단히 감사합니다.

+0

기기에서 지원하는 그래픽 API는 무엇입니까? – Shaman

+0

내 유니티의 playerSettings에서 그래픽 API가 OpenGLES2로 설정되었습니다. –

답변

1

이에 따르면 OpenGL ES 2.0은 단일 셰이더에서 최대 8 개의 텍스처 만 지원합니다. 또한 편집> 그래픽 에뮬레이션 메뉴로 이동하여 OpenGL ES 2.0을 선택하면 그에 대한 쉐이더 경고가 표시됩니다.

이 셰이더의 성능이 모바일에 적합한 지 확신하지 못합니까?

sampler2D의을 단일 셰이더에 너무 많이 사용하고 있습니다. 또한 셰이더 코드에서 값 비싼 수학 함수를 사용하지 않아야합니다. 셰이더는 모바일 용으로 비쌉니다.

모바일 최적화 herehere에 대해 자세히 알아볼 수 있습니다.

+0

오케이 그게 셰이더가 장치에서 작동하지 않는 이유입니다! 감사합니다. 링크에 감사드립니다. –

0

그래서 지금 나는 그것이 잘못된 길을하고 있다고 느낍니다. 이 셰이더는 문자 사용자 정의를 위해 수행되었으며 셰이더 기술은 0에 가까워서이 솔루션을 포기합니다.

마지막으로 런타임에서 필요한 텍스처를 병합하고 그 결과를 모바일 쉐이더에 적용하는 것이 더 좋습니다.