Шейдеры спрайтов. Переменные шейдера.

Шейдеры и все-все-все.

Шейдеры спрайтов. Переменные шейдера.

Сообщение XpomIX 28 июн 2021, 17:22

Привет, простите за нубский вопрос, скорее всего ответ есть с интернете, но как загуглить - не знаю.
У меня есть gameObject, у которого спрайт это часть большой текстуры, и шейдер, который в зависимости от координаты заливает только, то что ниже определённой y координаты, вот код:
Синтаксис:
  1. Shader "Unlit/spriteLoading" 
  2. Properties 
  3. [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} 
  4. _Color("Tint", Color) = (1,1,1,1) 
  5. percentage("Percentage", Range(0,1)) = 0.5 
  6.  
  7. _ColorMask("Color Mask", Float) = 15 
  8.  
  9. [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0 
  10.  
  11. SubShader 
  12. Tags 
  13. "Queue" = "Transparent" 
  14. "IgnoreProjector" = "True" 
  15. "RenderType" = "Transparent" 
  16. "PreviewType" = "Plane" 
  17. "CanUseSpriteAtlas" = "True" 
  18.  
  19. Stencil 
  20. Ref[_Stencil] 
  21. Comp[_StencilComp] 
  22. Pass[_StencilOp] 
  23. ReadMask[_StencilReadMask] 
  24. WriteMask[_StencilWriteMask] 
  25.  
  26. Cull Off 
  27. Lighting Off 
  28. ZWrite Off 
  29. ZTest[unity_GUIZTestMode] 
  30. Blend SrcAlpha OneMinusSrcAlpha 
  31. ColorMask[_ColorMask] 
  32.  
  33. Pass 
  34. Name "Default" 
  35. CGPROGRAM 
  36. #pragma vertex vert 
  37. #pragma fragment frag 
  38. #pragma target 2.0 
  39.  
  40. #include "UnityCG.cginc" 
  41. #include "UnityUI.cginc" 
  42.  
  43. #pragma multi_compile_local _ UNITY_UI_CLIP_RECT 
  44. #pragma multi_compile_local _ UNITY_UI_ALPHACLIP 
  45.  
  46. struct appdata_t 
  47. float4 vertex : POSITION; 
  48. float4 color : COLOR; 
  49. float2 texcoord : TEXCOORD0; 
  50. UNITY_VERTEX_INPUT_INSTANCE_ID 
  51. }; 
  52.  
  53. struct v2f 
  54. float4 vertex : SV_POSITION; 
  55. fixed4 color : COLOR; 
  56. float2 texcoord : TEXCOORD0; 
  57. float4 worldPosition : TEXCOORD1; 
  58. UNITY_VERTEX_OUTPUT_STEREO 
  59. }; 
  60.  
  61. sampler2D _MainTex; 
  62. fixed4 _Color; 
  63. fixed4 _TextureSampleAdd; 
  64. float4 _ClipRect; 
  65. float4 _MainTex_ST; 
  66. float percentage; 
  67.  
  68. v2f vert(appdata_t v) 
  69. v2f OUT; 
  70. UNITY_SETUP_INSTANCE_ID(v); 
  71. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); 
  72. OUT.worldPosition = v.vertex; 
  73. OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); 
  74.  
  75. OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 
  76.  
  77. OUT.color = v.color * _Color; 
  78. return OUT; 
  79.  
  80. fixed4 frag(v2f IN) : SV_Target 
  81. half4 color = tex2D(_MainTex, IN.texcoord); 
  82. if (color.a >= 0.2 && percentage < 1.0) { 
  83. color.a = (percentage - IN.texcoord.y) * 30; 
  84. return color; 
  85. ENDCG 
  86.  


Проблема в том, что когда высота спрайта меньше чем высота всей текстуры, тогда код работает некорректно.
Подскажите что-нибудь пожалуйста. :ympeace: :ympeace: :ympeace:
XpomIX
UNец
 
Сообщения: 5
Зарегистрирован: 10 май 2020, 22:56

Re: Шейдеры спрайтов. Переменные шейдера.

Сообщение DbIMok 28 июн 2021, 19:16

ну, проблема в том, что шейдер ожидает, что высота спрайта на всю UV, от 0 до 1, но в атласе это не так (там может его еще и развернуть, если установлена соотв. опция). то есть нам надо сообщить шейдеру новый интервал min..max. для этого смотрим, что есть подходящего в Sprite: rect, textureRect, uv. получаем из них координаты верхней и нижней точки, передаем их в шейдер. либо параметрами шейдера (но так может ломаться батчинг) либо как атрибуты вертекса (uv2 или что-то еще). в шейдере пересчитываем значение отталкиваясь от этих новых min..max
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3