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 на эти, изменил одну проверку условий для отзеркаливания спрайтов в зависимости от угла, и готово.
Всем огромное спасибо!
|
|
| |
|