Unity. Шейдеры

Feb 25, 2017 04:34

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


Технические требования у проектов на моей работе, конечно, высоки. Мы делаем проекты под Oculus Rift, на который рендерит GTX 750 Ti, чего очень мало для таких задач. Поэтому некоторые наши проекты были даже без карт теней от источников света, потому что это просаживало FPS слишком сильно. Сейчас у нас сцена чуть поменьше и мне повезло впихнуть и shadowmap, и Atmospheric Scattering. Застрял я сейчас на воде.

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

Все реализации воды для Unity, которые я видел, настолько унылы, что у меня рука не поднималась их использовать. В каждом применяется своя хитрая технология отражения, которая, разумеется, либо просаживает FPS, либо просто полностью нереалистично выглядит, а использовать LightProbe, встроенный в Unity, и ScreenSpaceReflections этот шейдер не учили. В Water+ мне не понравилось не только отражение. Я бы иначе реализовал муть в воде, я бы по-другому её подсвечивал, муть не отбрасывает тень на дно. Поэтому я решил попробовать собрать свой простой шейдер воды.

С Shader Forge я уже несколько раз разбирался, пару раз опыт работы был успешный и без особого труда мне удавалось собрать шейдер, который работал точно так, как мне надо, или почти как надо. Но не в этот раз. Как минимум, я так и не смог заставить шейдеры, сделанные в Shader Forge, отбрасывать полупрозрачную тень, так как это делает Standard Shader, например. При этом плоскость с шейдером отбрасывает тень, вся плоскость без учёта alpha-канала. В то же время, в отличии от Standard Shader, мой шейдер не принимает падающих теней, по сути он освещён по всей плоскости. Я уверен, у меня не удастся сделать эффект объёмного дыма, а хотелось бы. С другой стороны хоть так хотелось бы утемнить части в тени, потому что вода выглядит светящейся. Я погуглил про такую проблему и, в общем, пришёл к выводу, что эти проблемы вообще никто не решил в Shader Forge, разраб сказал "Я посмотрю и сделаю фикс к следующей версии", но фикса нет уже два года. А пользователи фиксили это, дописывая строки в шейдер руками.

И я решил, что для такой задачи придётся узнать как такой шейдер написать руками. Сейчас я в процессе изучения создания шейдеров для Unity. Доходит туго. Вот, например, дядька толково рассказывает введение в Vertex/Fragment шейдеры. Это сложнее, но гибче.

image Click to view


Приведу тут ссылки на материалы для изучения, которые я быстро нашёл в сети.

http://www.alanzucconi.com/2015/06/10/a-gentle-introduction-to-shaders-in-unity3d/
https://en.wikibooks.org/wiki/Cg_Programming/Unity
http://aras-p.info/blog/

https://developer.nvidia.com/cg-toolkit
http://http.developer.nvidia.com/Cg/index.html
https://learnopengl.com/
http://www.realtimerendering.com/
http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html

Если буду много стараться, разберусь как сделать даже нормальный Parallax эффект в замен того, что встроен в Standard Shader и выдаёт дырки и артефакты. Возможно, перепишу Screen Space Reflections и SSAO подкручу - это главные постэффекты, с которыми у меня были проблемы в работе. Так же полезным были бы шейдеры для смешивания материалов по Vertex Color, например.

Только что мне в голову пришла мысль о парадоксе цены. Можно купить в Asset Store уже готовый плагин Vertex Tools с шикарными шейдерами, в которых всё реализовано. Есть реализации Parallax Occlusion, есть SSRR, который довольно спорный, потому что я не видел как он работает с матовыми поверхностями, а это важно. Но всё же, заплатив деньги, ты сэкономишь на времени, которое ты затратишь на изучение матчасти и написание своего кода, который не обязательно будет лучше. Но получая новые знания и навыки, ты сам становишься дороже как специалист, поэтому твоё время становится дороже и, соответственно, при оплате этого времени заказчиком ты вполне можешь попросить больше.

В таком случае, простой была бы ситуация, в которой ты бы уже умел делать шейдеры, но купить готовый шейдер дало бы тебе больше денег, чем если бы ты написал свой, так как за сэкономленное время ты сможешь заработать ещё денег, которые окупят твои затраты. Но по скольку ты получишь навык, который принесёт тебе потом прибыль, время, затраченное на изучение, обойдётся тебе в будущем выгоднее, если ты сможешь этим навыком заработать больше денег.

В этой ситуации остаётся только необходимость применить полученные навыки для заработка. Иначе ты правда поступишь не рационально.

шейдер, shader, 3d, графика, размышления, unity 5

Previous post Next post
Up