| 
				
				Unity 3D. Неправильное освещение спрайтов, как исправить?
				 |   |  
| IgSa | Дата: Четверг, 30 Июня 2022, 17:02 | Сообщение # 1 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Товарищи, я разрабатываю 3D-проект. Графика сущностей и HUD'а представлена спрайтами. Проблема в том, что спрайтовый шейдер diffuse имплементирует освещение как бы наоборот (скрины прилагаются: https://imgur.com/a/EcJNnZt). Я перекопал весь интернет, нашёл несколько обращений с аналогичной проблемой, но на них не было ответов. Я пробовал многое, в том числе переход на URP с созданием шейдер-графа, ничего не меняется. Как можно инвертировать действие освещения на спрайты? Заранее спасибо
 
  
  
 |  
| 
 | 
 |    |  
| TLT | Дата: Четверг, 30 Июня 2022, 17:25 | Сообщение # 2 |  
 
 
Сейчас нет на сайте 
 
 | Ничего не понял, что не так...
  Дао, выраженное словами, не есть истинное Дао.
 |  
| 
 | 
 |    |  
| IgSa | Дата: Четверг, 30 Июня 2022, 17:28 | Сообщение # 3 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата TLT (  )   Ничего не понял, что не так...
  
  Спрайт затемняется с той стороны, с которой должен осветляться и наоборот
 |  
| 
 | 
 |    |  
| TLT | Дата: Четверг, 30 Июня 2022, 17:51 | Сообщение # 4 |  
 
 
Сейчас нет на сайте 
 
 | Цитата IgSa (  )   Спрайт затемняется с той стороны, с которой должен осветляться и наоборот  На скриншоте всё нормально. В общем, не сформулировав вопрос правильно, невозможно найти ответ. В этом и проблема.
  Дао, выраженное словами, не есть истинное Дао.
 |  
| 
 | 
 |    |  
| IgSa | Дата: Четверг, 30 Июня 2022, 19:05 | Сообщение # 5 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата TLT (  )   На скриншоте всё нормально. В общем, не сформулировав вопрос правильно, невозможно найти ответ. В этом и проблема. 
  Окей, тогда так: рядом капсула, с той стороны, где спрайт яркий, она серая (затемнённая), с той, где тусклый, она белая (освещена). Я просто не знаю, как прощеДобавлено (30 Июня 2022, 19:18) --------------------------------------------- https://imgur.com/a/6ZktwMr - вот пример с окрашенным точечным светом, для понимания 
 |  
| 
 | 
 |    |  
| Spring | Дата: Четверг, 30 Июня 2022, 20:29 | Сообщение # 6 |  
 
частый гость 
Сейчас нет на сайте 
 
 | Проблема в шейдере, я не сильно разбираюсь в них, но скинь код шейдера на всякий случай.
 |  
| 
 | 
 |    |  
| TLT | Дата: Четверг, 30 Июня 2022, 21:00 | Сообщение # 7 |  
 
 
Сейчас нет на сайте 
 
 | Цитата Spring (  )   Проблема в шейдере, я не сильно разбираюсь в них, но скинь код шейдера на всякий случай. 
  Код - https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/Sprites-Diffuse.shader
  Шейдер Sprite/Diffuse не поддерживается в URP, поэтому нужно написать свой собственный шейдер спрайтов для работы с 3D-освещением. Вот тут ответ по написанию шейдера - https://answers.unity.com/questions/1753586/using-urp-how-to-make-sprites-lit-by-3d-lights-aga.html
  А вот тут человек решил проблему удалением одной функции - https://answers.unity.com/questions/896100/custom-spritesdiffuse-shader-w-shadows-not-lightin.html
  Кто-то ещё рекомендует масштаб Z для игрового объекта, на котором находится спрайт, установить, как минимум, на 1. Либо поменять положение Z. См. https://gamedev.stackexchange.com/questions/129292/my-2d-sprite-diffuse-material-is-not-lighting-when-i-start-the-game
  Вот тут есть решение с точки зрения камеры - https://answers.unity.com/questions/1445661/2d-sprite-not-properly-affected-by-point-light.html
  Пробуйте, возможно, что-то получится.
  Дао, выраженное словами, не есть истинное Дао.
 |  
| 
 | 
 |    |  
| IgSa | Дата: Четверг, 30 Июня 2022, 21:01 | Сообщение # 8 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата Spring (  )   Проблема в шейдере, я не сильно разбираюсь в них, но скинь код шейдера на всякий случай. 
  Shader "Sprites/Custom/SpriteShadow" {  Properties  {  [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}  _Color("Tint", Color) = (1,1,1,1)  [MaterialToggle] PixelSnap("Pixel snap", Float) = 0  [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)  [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1)  [PerRendererData] _AlphaTex("External Alpha", 2D) = "white" {}  [PerRendererData] _EnableExternalAlpha("Enable External Alpha", Float) = 0  _Cutoff("Alpha Cutoff", Range(0,1)) = 0.5  }
   SubShader  {  Tags  {  "Queue" = "Transparent"  "IgnoreProjector" = "True"  "RenderType" = "Transparent"  "PreviewType" = "Plane"  "CanUseSpriteAtlas" = "True"  }
   Cull Off  Lighting Off  ZWrite Off  Blend One OneMinusSrcAlpha
   CGPROGRAM #pragma surface surf Lambert vertex:vert alphatest:_Cutoff addshadow nofog nolightmap nodynlightmap keepalpha noinstancing #pragma multi_compile_local _ PIXELSNAP_ON #pragma multi_compile _ ETC1_EXTERNAL_ALPHA #include "UnitySprites.cginc"
   struct Input  {  float2 uv_MainTex;  fixed4 color;  };
   void vert(inout appdata_full v, out Input o)  {  v.vertex = UnityFlipSprite(v.vertex, _Flip);
  #if defined(PIXELSNAP_ON)  v.vertex = UnityPixelSnap(v.vertex); #endif
   UNITY_INITIALIZE_OUTPUT(Input, o);  o.color = v.color * _Color * _RendererColor;  }
   void surf(Input IN, inout SurfaceOutput o)  {  fixed4 c = SampleSpriteTexture(IN.uv_MainTex) * IN.color;  o.Albedo = c.rgb * c.a;  o.Alpha = c.a;  }  ENDCG  }
   Fallback "Transparent/VertexLit" }Добавлено (30 Июня 2022, 21:07) ---------------------------------------------
  Цитата TLT (  )   Вот тут есть решение с точки зрения камеры - https://answers.unity.com/questions/1445661/2d-sprite-not-properly-affected-by-point-light.html 
  Кажется, это решение моего случая. Спасибо
 |  
| 
 | 
 |    |  
| Spring | Дата: Четверг, 30 Июня 2022, 21:18 | Сообщение # 9 |  
 
частый гость 
Сейчас нет на сайте 
 
 | Проблема не в шейдере, я надеялся на шейдер billboard, так понимаю скрипном поворачиваешь спрайт в камеру, скорей всего поворачивает код не ту сторону, которую надо. Если это transform.LookAt(target); то нужно добавить после цели Vector3.forward или back.Добавлено (30 Июня 2022, 21:40) --------------------------------------------- Сейчас потестил, Vector3.forward или back не помогают работает такой код:
  Код transform.LookAt(2 * transform.position - target.position);  
 |  
| 
 | 
 |    |  
| IgSa | Дата: Четверг, 30 Июня 2022, 22:35 | Сообщение # 10 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата IgSa (  )   Если это transform.LookAt(target); то нужно добавить после цели Vector3.forward или back. 
  Да, спасибоДобавлено (30 Июня 2022, 23:09) ---------------------------------------------
  Цитата Spring (  )   transform.LookAt(2 * transform.position - target.position); 
  https://imgur.com/a/q0le3qz
  Изменил параметры в методе LookAt на эти, изменил одну проверку условий для отзеркаливания спрайтов в зависимости от угла, и готово.
  Всем огромное спасибо!
 |  
| 
 | 
 |    |     
		
		 
 |