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

2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 17:49
OlegF
Поиском по форумам и в гугле ничего толкового найти не получилось. Скачал дефолтные шейдеры юнити и попробовал TreeSoftOcclusionLeaves.shader, но они не компилятся в 3.1, кидается куча ошибок и рекомендуется юзать surface шейдеры.

Задача простая - есть деревья, есть плашки с текстурами веток и прочего, их нужно рисовать с двух сторон. Можно только диффузно, можно без теней (хотя тени желательны). Копировать вершины/фейсы и флипать нормали не разрешается, нужен минимум фейсов в модели. Мне порекомендовали написать шейдер, который рендерит в одном проходе фронт фейсы, а во втором проходе флипает нормали и рендерит бекфейсы (и меняет CW на CCW). Такой вполне подошел бы, но сделать надо за сегодня/завтра, а я в юнити и ее шейдерах разбираюсь слабо. Помогите ссылкой или примерами :)

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 18:08
Paul Siberdt
http://unity3d.ru/distribution/viewtopic.php?f=16&t=3580

Недавняя тема. Вам надо изучить вопрос, как скопировать понравившийся шейдер для листвы и поставить ему Off для параметра Cull

Кстати, материалы из раздела Particles, как помнится, двусторонние. Попробуйте их.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 18:38
OlegF
Если мы просто включим задние фейсы, их освещение будет некорректно, т.е они будут освещаться с учетом тех же нормалей, что и передние фейсы. Задача - корректное диффузное освещение с альфатестом. По этой же причине не подходят двухсторонние материалы из раздела Particles, там используется блендинг, а не альфатест. Фактически нужно сэмулировать на шейдере дублирование геометрии с инвертированием нормалей для задних фейсов.

Можно переформулировать задачу так - нужен шейдер освещения с альфа тестом и желательно с тенями, дополнительный проход я сам напишу. Код должен быть на CG, потому что surface шейдеры сами генерируют проходы.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 21:00
gnoblin
шейдер на CG не будет нормально работать с освещением

Копировать вершины/фейсы и флипать нормали не разрешается, нужен минимум фейсов в модели.

В обоих случаях геометрия будет дублироваться, что ручками в 3д пакете, что вторым проходом с cull off и инвертированными нормалями.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 21:02
gnoblin
Если учитывать что сурфейс шейдер в два прохода сделать не получится, я бы остановился на варианте с дублированием геометрии.

Либо придется делать два объекта\один объект с двумя материалами с двумя разными шейдерами.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 19 фев 2011, 21:48
alexz
gnoblin писал(а):Если учитывать что сурфейс шейдер в два прохода сделать не получится, я бы остановился на варианте с дублированием геометрии.

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

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 20 фев 2011, 01:14
gnoblin
Кстати да!
Отличное решение :ymsmug: .

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 20 фев 2011, 01:17
Neodrop
Тут есть скриптик для инвертации нормалей. Правда на жабе, вроде, если я не запамятовал.
Или могу поделиться переработанным вариантом.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 20 фев 2011, 16:58
OlegF
Пока да, приходится дублировать геометрию. Двухпроходный шейдер - требования заказчика. Опишу ситуацию чуть более подробно. Наша программа генерит некоторую геометрию (растения итд.), заказчик попросил перебросить все это в Юнити с определенными ограничениями по геометрии/шейдерам. Каждое растение, грубо говоря, состоит из нескольких частей: солид геометрия, которую можно рендерить любым встроенным шейдером, плашки, т.е двухсторонние плоскости, тут меня попросили использовать двухпроходный шейдер и билборды (аля спид три). Так что еще придется как-то писать шейдер для билбордов, пока что тупо юзается юнитевская система частиц. :)
Очень бы хотелось найти работающий шейдер с освещением и тенями на Cg для версии 3.1. Все, что я смог найти именно на Cg было сделано для 2.0, в частности втроенные шейдеры (builtin shaders) с оф. сайта Юнити. Surface-шейдеры, FFP-материалы и встроенные шейдеры к сожалению не походят. Помогите плиз с примером такого шейдера.

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 20 фев 2011, 17:59
gnoblin
чем не подходит сурфейс шейдер?

чем обусловлено требование заказчика? :ymtongue:

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 20 фев 2011, 21:01
OlegF
чем не подходит сурфейс шейдер?

Код должен быть на CG, потому что surface шейдеры сами генерируют проходы.


Плюс надо писать свой шейдер для билбордов, для чего surface шейдеры тоже не подходят (нужен доступ к атрибутам вершины). Решение простое - поделитесь пожалуйста ссылкой или исходником Cg шейдера освещения под версию 3.1, как-то же в юнити можно писать свои шейдеры, контролирующие все, а не только освещение?

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 21 фев 2011, 00:35
gnoblin
В сурфейс шейдере можно манипулировать вершинами.

Сурфейс шейдер сам генерит проходы - и?

Можно взять скомпилированный сурфейс шейдер и добавить свой проход куда нужно (правда, это уже продвинутая техника :) ).

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 21 фев 2011, 00:37
gnoblin
Мне уже эта тема начинает немного напоминать троллинг :-\

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 21 фев 2011, 09:06
Guyver
жаль что поздно ....

а какбы кто запрещает флипать нормали в шейдере? ... сделать if для напраления нормали к свету ну и там решать прямая нормаль или обратная будет браться

фактически узнать туда ли смотрит нормаль это

[псевдокод]
float lit = dot(l,n);
if (lit > 0)
{
return lit;
} else
{
return dot(l,flip(n));
}

тупой и дешовый фейк без ифов но c не корректной картинкой abs(dot(l,n)) (п.с. для лисьтев может проканать как мега фейковый сабсурфейс скаттеринг)

Re: 2-х сторонний материал для веток

СообщениеДобавлено: 21 фев 2011, 14:28
gnoblin
насколько я знаю быстрее будет работать ?-синтаксис O:-)