HLSL (Unity-only ok, не обязательно), сочетающий трафарет и обратное отсечение в мировом пространстве
Я построил шейдер рабочей поверхности (назовите его "страна чудес"), который будет отображаться как невидимый, если сопутствующий шейдер LookingGlass не пересекается с ним с точки зрения камеры. Простое трафаретное расположение шейдеров.
Очень просто.
Я могу добавить настройки шейдера, чтобы указать плоскость, или даже просто минимальное значение Z в мировом пространстве, и использовать clip(), чтобы визуализировать пиксели только на одной стороне этой плоскости... (другими словами, я мог бы использовать это для обрезки содержимого это разрешено трафаретом.)
То, что я хочу сделать, это использовать трафарет на поверхностях "через зеркало", (чтобы показать геометрию, которая находится внутри зеркала) и всегда рендерить эти поверхности, когда они находятся на "нашей" стороне зеркала (чтобы всегда покажи им, если они на этой стороне портала зазеркалье). например, если z<0, выполнить рендеринг, если значение Stencil Ref выполнено. если z>=0, отрендерить независимо.
Теперь в Unity я могу прикрепить два материала к компоненту MeshRenderer (один с трафаретным шейдером, другой с шейдером "плоскость отсечки") - это работает отлично. Это довольно круто, на самом деле, по крайней мере, визуально. Но хотя я еще не тестировал его, я инстинктивно верю, что он будет сильно влиять на частоту кадров, если есть несколько объектов, довольно сложной геометрии и т. Д., Настроенных с помощью этой схемы.
(Я также могу управлять вложением шейдеров в коде и делать это только тогда, когда ожидаю, что что-то изменится, но я действительно надеюсь получить из этого унифицированный шейдер, чтобы избежать ненужных вызовов отрисовки.)
1 ответ
Оказывается, то, что я искал, невозможно.
Два шейдера, которые я хочу объединить, являются поверхностными шейдерами. В то время как вы можете объединить несколько поверхностных шейдеров в многопроходный шейдер, вы не можете объединить несколько поверхностных шейдеров, с помощью трафарета и с помощью clip(), где клип применяется к проходам, которых нет у трафарета, и наоборот.
Существуют комбинации, которые могут достичь этой цели или могут полностью достичь цели с помощью поверхностных и вершинных (или других не-сёрфинговых) шейдеров, но комбинация требований, предусмотренных этим вопросом, не поддерживается по желанию.
Хотя это не отвечает на этот вопрос, обходной путь в Unity - создать два материала, которые предоставляют каждый элемент функциональности. Они оба могут существовать в элементе, который нуждается в обеих частях, и код может в противном случае управлять тем, активно ли используется один или другой, или оба.
Подобные решения будут доступны в других пакетах.