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

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

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

Сообщение Woland 07 май 2020, 12:08

Всем привет!
Есть шейдер от 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;
                        }
 
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение Jarico 07 май 2020, 12:29

Сложно текстуру умножить на цвет и на альфу? в Графе всё есть для этого
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение Woland 07 май 2020, 12:46

Не совсем понимаю, что мы здесь на что умножаем) у нас есть _MainTex (насколько я понял, это tex), а i это что?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение Woland 07 май 2020, 13:29

Я поясню, что я вообще хочу.
Есть спрайт, при использовании стандартного шейдера он выглядит так (видный черные обводки)
Изображение

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

Мне и нужно добиться такого эффекта через shader graph) Вот и пытаюсь разобраться, что это за код, на что он влияет и как его реализовать
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение waruiyume 07 май 2020, 14:58

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

Это интерполированный результат вертексного шейдера, сокращение от input. i.color- это цвет вертекса.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Woland 07 май 2020, 15:21

_STRAIGHT_ALPHA_INPUT используется только в условии #if defined(_STRAIGHT_ALPHA_INPUT) #else.
Blend One OneMinusSrcAlpha есть, да
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение waruiyume 07 май 2020, 16:37

Прошу прошения, я, глазами _STRAIGHT_ALPHA_INPUT не заметил, а искал _StraightAlphaInput :o)
По идеи должно быть так: https://yadi.sk/i/6DwdcVeUg0x_Aw
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Woland 07 май 2020, 17:47

К сожалению, не работает, как был outline, так и остался (AlphaClipThreshold просто обрезает низкую альфу, это не то явно). Плюс, изначально это шейдер Lit, на него воздействует 2D свет от URP.
Может ли другая часть шейдера влиять на этот эффект?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение waruiyume 07 май 2020, 17:49

По идеи больше нечему влиять. Киньте сюда текстуру, потыкать.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Woland 07 май 2020, 18:02

https://dropmefiles.com/j0m4k
Путем нехитрых манипуляций (удаление умножения на rgb вертекса) стало ясно, что это вообще никак не влияет на отображение, значит, влияет что-то другое.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение Woland 08 май 2020, 14:03

Получил официальный ответ от 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) - получается откровенная хрень)

Изображение
Изображение
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

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

Сообщение waruiyume 08 май 2020, 16:45

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

Или попробовать экспортнуть картини без предумноженного цвета и использовать альфабленд.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Woland 08 май 2020, 16:50

В итоге так и делаю (выгружаю без предумноженной альфы), стандартный шейдер нормально работает
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт


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

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

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