Страница 1 из 1

Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 12:08
Woland
Всем привет!
Есть шейдер от Spine, там есть определенный кусок кода, который меня интересует. Можете подсказать, пожалуйста, что в нем происходит и как его перевести в shader graph?) Спасибо!
Синтаксис:
Используется csharp
Properties {
                [NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
                [NoScaleOffset] _MaskTex("Mask", 2D) = "white" {}
                [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
                [HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
                [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Compare", Float) = 0.0 // Disabled stencil test by default
        }
........
struct Varyings
                        {
                                float4  positionCS              : SV_POSITION;
                                float4  color                   : COLOR;
                                float2  uv                              : TEXCOORD0;
                        };
float4 UnlitFragment(Varyings i) : SV_Target
                        {
                                half4 tex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
                                half4 main;
                                //интересует эта часть
                                #if defined(_STRAIGHT_ALPHA_INPUT)
                                main.rgb = tex.rgb * i.color.rgb * tex.a;
                                #else
                                main.rgb = tex.rgb * i.color.rgb;
                                #endif
                                main.a = tex.a * i.color.a;

                                return main;
                        }
 

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 12:29
Jarico
Сложно текстуру умножить на цвет и на альфу? в Графе всё есть для этого

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 12:46
Woland
Не совсем понимаю, что мы здесь на что умножаем) у нас есть _MainTex (насколько я понял, это tex), а i это что?

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 13:29
Woland
Я поясню, что я вообще хочу.
Есть спрайт, при использовании стандартного шейдера он выглядит так (видный черные обводки)
Изображение

При использовании шейдера с кодом, приведенным выше, при выключенном значении STRAIGHT_ALPHA_INPUT получается такой результат (обводки нет):
Изображение

Мне и нужно добиться такого эффекта через shader graph) Вот и пытаюсь разобраться, что это за код, на что он влияет и как его реализовать

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 14:58
waruiyume
Вы показали проперти _StraightAlphaInput, а где оно потом используется мы должны сами догадаться.
Вангую: в шейдере используется Premultiplied alpha и нужно поставить смешивание "Blend One OneMinusSrcAlpha".
а i это что?

Это интерполированный результат вертексного шейдера, сокращение от input. i.color- это цвет вертекса.

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 15:21
Woland
_STRAIGHT_ALPHA_INPUT используется только в условии #if defined(_STRAIGHT_ALPHA_INPUT) #else.
Blend One OneMinusSrcAlpha есть, да

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 16:37
waruiyume
Прошу прошения, я, глазами _STRAIGHT_ALPHA_INPUT не заметил, а искал _StraightAlphaInput :o)
По идеи должно быть так: https://yadi.sk/i/6DwdcVeUg0x_Aw

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 17:47
Woland
К сожалению, не работает, как был outline, так и остался (AlphaClipThreshold просто обрезает низкую альфу, это не то явно). Плюс, изначально это шейдер Lit, на него воздействует 2D свет от URP.
Может ли другая часть шейдера влиять на этот эффект?

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 17:49
waruiyume
По идеи больше нечему влиять. Киньте сюда текстуру, потыкать.

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 07 май 2020, 18:02
Woland
https://dropmefiles.com/j0m4k
Путем нехитрых манипуляций (удаление умножения на rgb вертекса) стало ясно, что это вообще никак не влияет на отображение, значит, влияет что-то другое.

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 08 май 2020, 14:03
Woland
Получил официальный ответ от Spine

By default, Spine will export your atlas textures as Premultiplied alpha textures. See this section on the spine-unity pages how the two workflows differ in the export and import pipeline: spine-unity Runtime Documentation: Advanced Premultiplied vs Straight Alpha Import

Now you have multiple options:
A) Change the exported atlas texture format from Premultiplied alpha to Straight alpha in the atlas texture export settings.
B) Adapt the shader graph to Premultiplied alpha textures: either a) change the blend mode to additive blending Blend One OneMinusSrcAlpha, or b) un-premultiply the texture color after use by dividing texColor.rgb by texColor.a value.

Пробовал сделать, как описано в конце (un-premultiply the texture color after use by dividing texColor.rgb by texColor.a value) - получается откровенная хрень)

Изображение
Изображение

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 08 май 2020, 16:45
waruiyume
Я думаю, что это глюк шейдерграфа. Если там уже предумноженный цвет, то нужно только сменить режим смешивания, ничего больше делать не надо, и это работает в традиционно написанном шейдере.
Могу предложить написать багрепорт, а шейдер попробовать написать руками.
Не знаю насколько актуальна эта статья, но что могу:
https://catlikecoding.com/unity/tutoria ... ne/lights/

Или попробовать экспортнуть картини без предумноженного цвета и использовать альфабленд.

Re: Перевести шейдер в shader graph

СообщениеДобавлено: 08 май 2020, 16:50
Woland
В итоге так и делаю (выгружаю без предумноженной альфы), стандартный шейдер нормально работает