Пятница, 22 Ноября 2024, 00:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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 на эти, изменил одну проверку условий для отзеркаливания спрайтов в зависимости от угла, и готово.

Всем огромное спасибо!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг