Как движок ландшафта Unity добавляет произвольное количество проходов шейдеров?

Прямо сейчас я работаю над проектом, который включает в себя применение splatmaps к сгенерированному мешу. Я пытаюсь использовать встроенные шейдеры Terrain для достижения этой цели, но сталкиваюсь с одной проблемой, которая касается шейдеров "FirstPass" и "AddPass".

Довольно ясно, как эти шейдеры должны работать. FirstPass применяется и обрабатывает 4 текстуры и текстуру управления (сплат). Если пользователь применяет более 4 текстур, AddPass (который очень похож на FirstPass) "добавляется" как еще один проход шейдера во время компиляции. AddPass добавляется произвольное количество раз в зависимости от того, сколько текстур пользователь применяет к ландшафту (4 текстуры за проход).

Как двигатель местности достигает этого многопроходного эффекта? Количество необходимых проходов может быть определено во время компиляции, поэтому я не думаю, что это невозможно... Я просто не знаю, куда идти дальше. Я думаю, что это может иметь какое-то отношение к свойствам зависимости в нижней части FirstPass, но я не уверен.

Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Standard-AddPass"
Dependency "BaseMapShader" = "Hidden/TerrainEngine/Splatmap/Standard-Base"

Если у кого-то есть понимание этого, пожалуйста, дайте мне знать. Для удобства я загрузил файлы шейдеров FirstPass, AddPass и TerrainEngine.cginc из архива Unity в pastebin.

Спасибо!

1 ответ

Решение

Для тех, кому любопытно, я действительно нашел ответ сам. Внутренне похоже, что Terrain Engine использует скрытый MeshRenderer для одновременного включения нескольких шейдерных проходов. Для достижения этого эффекта многопроходности TerrainEngine добавляет шейдер FirstPass к созданному экземпляру Material и назначает его в поле материала в MeshRenderer. Если требуется более 4 текстур, шейдер AddPass также добавляется к материалу и добавляется к полю материалов.

Обратите внимание, что MeshRenderer предупредит вас об использовании нескольких проходов шейдера на одной сетке. Это предупреждение можно игнорировать, поскольку для отображения сплат-карт требуется несколько проходов шейдера, если требуется более 4 текстур.

Другие вопросы по тегам