Как импортировать прекомпилированные шейдеры в Unity 2019?

Полезная литература, исходники шейдеров из серьезных игр и других движков, ссылки на тематические ресурсы - всё здесь.

Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение Albeoris 28 июн 2019, 23:57

Доброго времени суток!

Есть 141 прекомпилированный шейдер и проект под Unity 5. Исходников шейдеров больше нет.
"Прекомпилированный" означает, что он уже собран под определенную платформу и вместо этого:
Синтаксис:
Используется csharp
VS_OUTPUT VS_Main(float4 InPos: POSITION0, float2 InTexCoord : TEXCOORD0)

У меня это:
Синтаксис:
Используется csharp
GpuProgramID 39543
Program "vp" {
    SubProgram "d3d9 " {

Проблема в том, что с 2015 года Unity не поддерживает импорт прекомпилированных шейдеров из-за проблем с производительностью.

Но вот этот конструктор остался, и, вроде бы, всё ещё работает:
Синтаксис:
Используется csharp
Material(string contents)


Те места в коде, где шейдеры грузились из ассетов, я перевёл на него.
Но остались шейдеры, прописанные в сценах. Что делать с ними?

Может быть, есть какой-нибудь хитрый способ заставить Unity работать с прекомпилированными шейдерами, или декомпилятор, который превратит платформозависимый код в исходники?
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение DbIMok 29 июн 2019, 00:07

т.е. все норм, проблема только достать шейдеры из сцен?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение Albeoris 29 июн 2019, 00:19

Ну как только - нужно пройтись по всем объектам, во всех сценах и заменить около 1000 ссылок на шейдеры какими-нибудь скриптами, которые будут загружать их, как текстовые файлы. Очень хотелось бы этого избежать...

А то я уж и не знаю что проще - это, или распарсить 2.0 инструкции и превратить их в исходники. Но то, что этого ещё никто не сделал настораживает - возможно, задача не столь тривиальная, как кажется на первый взгляд.
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение Albeoris 29 июн 2019, 01:18

DbIMok писал(а):т.е. все норм, проблема только достать шейдеры из сцен?

Я рано обрадовался. Чёрта с два оно работает:
Trying to create a material from string - this is no longer supported.
UnityEngine.Material:.ctor(String)

Увы, нужно как-то иначе действовать. Но я морально не готов переписывать 140 шейдеров. :( :|
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение DbIMok 29 июн 2019, 02:12

да, я тоже удивился, но раз пишут, что работает...
можно посмотреть в сторону https://aras-p.info/blog/2014/03/28/cro ... s-in-2014/
в частности https://github.com/James-Jones/HLSLCrossCompiler
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение Albeoris 29 июн 2019, 02:45

Спасибо огромное! Выглядит обнадёживающе!
Жаль только "Work is underway to support the DX9 bytecode formats: vs_2_0, ps_2_0". Но их поддержку я могу запилить и сам...
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12

Re: Как импортировать прекомпилированные шейдеры в Unity 2019?

Сообщение Albeoris 29 июн 2019, 14:00

Так, у меня проблема.
Вот пример стандартного, уже сериализованного шейдера из набора NGUI:

Скрытый текст:
Синтаксис:
Используется glsl
Shader "Unlit/Transparent Colored (Packed) (TextureClip)" {
        Properties {
                _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" { }
        }
        SubShader {
                LOD 200
                Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" }
                Pass {
                        Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" }
                        ZWrite Off
                        Cull Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        ColorMask RGB
                        Offset -1, -1
                        GpuProgramID 39543
                        Program "vp" {
                                SubProgram "d3d9 " {
                                        Bind "vertex" Vertex
                                        Bind "color" Color
                                        Bind "texcoord" TexCoord0
                                        Matrix 0 [glstate_matrix_mvp]
                                        Vector 4 [_MainTex_ST]
                                        "vs_2_0
                                                dcl_position v0
                                                dcl_color v1
                                                dcl_texcoord v2
                                                dp4 oPos.x, c0, v0
                                                dp4 oPos.y, c1, v0
                                                dp4 oPos.z, c2, v0
                                                dp4 oPos.w, c3, v0
                                                mad oT1.xy, v0, c4, c4.zwzw
                                                mov oD0, v1
                                                mov oT0.xy, v2
                                               
                                                "

                                }
                        }
                        Program "fp" {
                                SubProgram "d3d9 " {
                                        SetTexture 0 [_MainTex] 2D 0
                                        SetTexture 1 [_ClipTex] 2D 1
                                        "ps_2_0
                                                def c0, 0.5, -0.5, 0.50999999, -2.04081631
                                                dcl v0
                                                dcl t0.xy
                                                dcl t1.xy
                                                dcl_2d s0
                                                dcl_2d s1
                                                mad r0.xy, t1, c0.x, c0.x
                                                texld_pp r1, t0, s0
                                                texld_pp r0, r0, s1
                                                add_pp r2, v0, c0.y
                                                frc_pp r3, -r2
                                                add_sat_pp r2, r2, r3
                                                mul_pp r0.xy, r1, r2
                                                add_pp r0.x, r0.y, r0.x
                                                mad_pp r0.x, r1.z, r2.z, r0.x
                                                mad_pp r0.x, r1.w, r2.w, r0.x
                                                mad_pp r1, r2, c0.z, -v0
                                                mul_sat_pp r1, r1, c0.w
                                                mul_pp r0.y, r0.w, r1.w
                                                mul_pp r1.w, r0.x, r0.y
                                                mov_pp oC0, r1
                                               
                                                "

                                }
                        }
                }
        }
        Fallback Off
}


Само собой, кроме Unity такой формат никто не поддерживает, что логично.
Я могу выдрать непосредственно ассемблерный код:
Синтаксис:
Используется glsl
                                        "vs_2_0
                                                dcl_position v0
                                                dcl_color v1
                                                dcl_texcoord v2
                                                dp4 oPos.x, c0, v0
                                                dp4 oPos.y, c1, v0
                                                dp4 oPos.z, c2, v0
                                                dp4 oPos.w, c3, v0
                                                mad oT1.xy, v0, c4, c4.zwzw
                                                mov oD0, v1
                                                mov oT0.xy, v2
                                               
                                                "


И транслировать его в байт-код при помощи D3DAssembly.
Тот же HLSL Cross Compiller прекрасно справляется с чтением этого фрагмента. Но в процессе трансляции в GLSL сталкивается в проблемой:
Изображение

И это не удивительно - так как никакой мета-информации в шейдере не осталось.
Вопрос - что делать? В каком формате и какую часть шейдера из примера выше скормить HLSL Compiller'у, и главное - как? :) [curved_hands]
Albeoris
UNIт
 
Сообщения: 146
Зарегистрирован: 19 окт 2013, 13:12


Вернуться в Шейдерная школа

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

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