CrossFading для лодов без использования LodGroup

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

CrossFading для лодов без использования LodGroup

Сообщение Diab10 27 авг 2016, 10:08

Всем привет! :)

LodGroup посылает данные о необходимости трансформации лодов в шейдеры, а шейдеры уже колдуют.
В шейдере в unity_LODFade.x хранится текущее состояние перехода, от 0 до 1. (0 - полностью прозрачен, 1 - полностью виден, либо наоборот).

Можно ли обойтись без LodGroup?
Попробовал послать данные в шейдер:
obj.gameObject.GetComponent<MeshRenderer>().sharedMaterial.SetVector("unity_LODFade", new Vector4(znachenie, 1,1,1));

Консоль выдала предупреждение:
Trying to set builtin parameter "unity_LODFade". Will be ignored.


В исходниках шейдеров ничего подходящего не нашёл, видимо там не все исходники есть

Что делать? :)
Хочу, чтобы SpeedTree деревья работали без террейна и без LodGroup, чтобы переход лодов включать своими скриптами.
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: CrossFading для лодов без использования LodGroup

Сообщение jetyb 27 авг 2016, 15:02

Логично. Вы попробовали перезаписать системную шейдерную переменную unity_LODFade, которая также используется и перезаписывается движком. Использование одной и той же переменной 2 разными системами приводит к их некорректной работе.
Движку то откуда знать, что вы не будете использовать 2 системы одновременно, он предполагает худшее и избегает потенциальных багов.
Либо пользуйтесь на переназначая unity_LODFade
Либо введите и переназначайте чисто свою my_LODFade и перепишите через нее шейдер
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: CrossFading для лодов без использования LodGroup

Сообщение Diab10 27 авг 2016, 15:43

jetyb писал(а):Логично. Вы попробовали перезаписать системную шейдерную переменную unity_LODFade, которая также используется и перезаписывается движком. Использование одной и той же переменной 2 разными системами приводит к их некорректной работе.
Движку то откуда знать, что вы не будете использовать 2 системы одновременно, он предполагает худшее и избегает потенциальных багов.
Либо пользуйтесь на переназначая unity_LODFade
Либо введите и переназначайте чисто свою my_LODFade и перепишите через нее шейдер


Смысл в том, что мне нужно как то передать в шейдер команду на изменение лода. Как я понял, этим руководит unity_LODFade. Переписывать на свою мне не нужно, нужно заставить работать стандартные шейдеры без LodGroup. Сам LodGroup посылает в шейдер какие то команды, которых я не знаю.

Ещё, подскажите плиз как читать этот код:

Синтаксис:
Используется csharp
#ifdef LOD_FADE_CROSSFADE
        #define UNITY_DITHER_CROSSFADE_COORDS                                   half3 ditherScreenPos;
        #define UNITY_TRANSFER_DITHER_CROSSFADE(o,v)                    o.ditherScreenPos = ComputeDitherScreenPos(mul(UNITY_MATRIX_MVP, v));
#else
        #define UNITY_DITHER_CROSSFADE_COORDS
        #define UNITY_TRANSFER_DITHER_CROSSFADE(o,v)
#endif
 


С ifdef и else всё понятно.
Дальше что происходит? #define UNITY_DITHER_CROSSFADE_COORDS это же вроде как объявление символа, но почему дальше на этой строчке код идёт? Он выполнится или что? Да и UNITY_TRANSFER_DITHER_CROSSFADE(o,v) это похоже ф-я, а не символ, я запутался :)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: CrossFading для лодов без использования LodGroup

Сообщение jetyb 28 авг 2016, 05:37

Смысл в том, что мне нужно как то передать в шейдер команду на изменение лода. Как я понял, этим руководит unity_LODFade. Переписывать на свою мне не нужно, нужно заставить работать стандартные шейдеры без LodGroup. Сам LodGroup посылает в шейдер какие то команды, которых я не знаю.

А вот придется. Простая замена везде в связанных шейдерах и библиотеках unity_LODFade на my_LODFade

Дальше что происходит? #define UNITY_DITHER_CROSSFADE_COORDS это же вроде как объявление символа, но почему дальше на этой строчке код идёт?

Стандартная C-шная директива. Гугл "C #define".
В данном случае означает замену везде в коде строки UNITY_DITHER_CROSSFADE_COORDS на half3 ditherScreenPos; на этапе компиляции.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: CrossFading для лодов без использования LodGroup

Сообщение Diab10 28 авг 2016, 10:19

jetyb писал(а):В данном случае означает замену везде в коде строки UNITY_DITHER_CROSSFADE_COORDS на half3 ditherScreenPos; на этапе компиляции.

Понял, спасибо :-bd

jetyb писал(а):А вот придется. Простая замена везде в связанных шейдерах и библиотеках unity_LODFade на my_LODFade


Да, видимо придётся всё переписывать под собственную систему лодов. Но если кто то найдёт решение - поделитесь плиз
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023


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

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

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