Войти
ПрограммированиеФорумГрафика

Unity: CutOut-шейдер отбрасывает неверную тень только при запекании.

#0
11:36, 7 сен 2017

Привет всем.
В юнити есть возможность задать Standard-шейдер как CutOut и все работает отлично: реалтайм и бэйкед тени нормально рисуются. Я взял стандартный поверхностный шейдер, добавил FallBack "Transparent/Cutout/VertexLit" и сделал свой Cutout шейдер:
Картинка:

+ Показать

Код:

+ Показать

Все бы хорошо, этот шейдер тоже тени отбрасывает, но мой шейдер не использует tilling и offset, эти параметры считаются в самом шейдере. В таком случае что происходит: реалтайм тень рисуется по вычисленным мною тайлингу и офсету, а вот запеченая тень рисуется по тайлингу 1,1, офсету 0,0. Хотя, если поменять значения тайла и оффсета на материале руками, например задать тайл 2,1, то запеченая тень учтет именно эти значения:
Картинка:

+ Показать

Да, ещё когда беру модель с данной текстурой, то новая оранжевая обводка юнити обводит мешь с моим материалом в соответствии с тем какие параметры тайла и оффсета выставлены в инспекторе. Как переназначить параметры тайлинга и оффсета прямо в шейдере? Почему при запекании используются знчения тайла и оффсета из _MainTex_ST?


#1
12:27, 7 сен 2017

Там вроде meta pass должен за это отвечать.

#2
13:41, 7 сен 2017

Нашёл в сети пример мета пасса, описание: https://docs.unity3d.com/530/Documentation/Manual/MetaPass.html.
Вставил пасс, поизменял цвета в фрагментной функции, вообще ничего не происходит, тень запекается согласно стандартным параметрам тайлинга. Никому не попадался пример метапасса с настройкой тайлинга и оффсета?
Вот найденный мета-пасс:

+ Показать
#3
16:36, 7 сен 2017

Alerr
а галочка "static" стоит? запекаются только объекты со static, если память не подводит

#4
16:51, 7 сен 2017

bool, стоит. Даже поставил галочки ShadowCast/ShadowReceive.

#5
18:15, 7 сен 2017

Пальцем в небо: а если параметр "addshadow" добавить?

#pragma surface surf Standard fullforwardshadows alphatest:_Cutoff addshadow

#6
18:16, 7 сен 2017

У тебя в метапассе нет самого катаута.
clip( texcol.a*_Color.a - _Cutoff );

#7
19:01, 7 сен 2017

alt3d, не прокатило.
Bonus, поставил клип и ничего не происходит. Кажется метапасс вообще не исполняется при запекании.

#8
12:35, 8 сен 2017

Попробуй удали лайтмапы и перезапеки снова с новым метапассом, в котором есть катаут. Иногда такое бывает.

#9
12:54, 8 сен 2017

Bonus
> Попробуй удали лайтмапы и перезапеки снова с новым метапассом, в котором есть катаут. Иногда такое бывает.

Пробовал, даже создал отдельную сцену с парой объектов исключительно для тестов этого шейдера.

#10
15:21, 8 сен 2017

насколько я знаю, при запекании Юнити сам определяет, где в объекте дыры, где прозрачное стекло и тп. Для этого Юнити использует переменные с именами _MainTex, _Color и _Cutoff. То есть нужно просто соблюдать name conventions и все. Соответственно, при запекании Юнити использует тайл и оффсет из _MainTex_ST. Твой код в мета пассе никак повлиять на это не может, clip'ать там ничего не нужно, потому что мета пасс нужен просто чтобы указать лайтмэпперу, в какую часть lightmap'а и с каким scale'ом запекать свет для данного объекта, и цветовые свойства поверхности (albedo и emission).

#11
15:31, 8 сен 2017

arcturgray, спасибо за разъяснения.

ПрограммированиеФорумГрафика

Тема в архиве.