Шейдер, который «прорезает» дыру через всю геометрию

11

Как я могу создать шейдер, который «прорезает» всю геометрию, только отрисовывая очищающий фон в Unity? Пример:

введите описание изображения здесь

Это призма в огромной белой комнате в форме коробки. Поверхность призмы просто отображает скайбокс (звездное небо). Я использовал несколько камер, что довольно неэффективно ... Должен быть способ только с шейдерами.

Как я могу это сделать?

CalebHC
источник

Ответы:

15

Ок, наконец-то разобрался!

введите описание изображения здесь

Вы видите, как сферическая сетка «прорезает» цилиндр и плоскость вплоть до скайбокса. Мне потребовалось больше времени, чем ожидалось, чтобы понять это, но благодаря вики-странице ( http://wiki.unity3d.com/index.php/DepthMask ) я все разобрал.

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

Итак, я настроил сцену так, как ...

  1. добавлен реалистичный скайбокс (наса)

  2. добавил несколько фигур

  3. добавлен скрипт SetRenderQueue для плоскости, сферы и цилиндра

  4. установите порядок очереди в сфере на 2999 (остальные объекты на 3000)

  5. затем добавил шейдер DepthMask к сфере

Вот и все. Любые вопросы, дайте мне знать!

CalebHC
источник
2
О, я полностью переосмыслил проблему в моем посте выше (я действительно думал о плоских отверстиях на стенах / полах). Связанное решение показывает трехмерный объект дыры, и решение, показанное для этого случая, очень просто - все, что вам действительно нужно сделать, это записать «дыру» в z-буфер без записи какого-либо цвета и убедиться, что отверстие нарисовано рано.
Bluescrn
@bluescrn Не беспокойся! Я ценю подробный пост. :)
CalebHC
2

Несколько вариантов, чтобы получить желаемый эффект, но они стоят денег:

  • Запишите отверстия в буфер трафарета или целевой альфа-канал, затем нарисуйте скайбокс последним, используя подходящий шаблон трафарета или альфа-смесь, и без z-теста?

или

  • Рендеринг скайбокса в текстуру в начале кадра и проецирование на «геометрию отверстия»

Я подозреваю, что должен быть способ сделать это, используя / злоупотребляя z-буфером, но вы, вероятно, захотите провести z-тестирование «дырочных многоугольников» с использованием их реального Z, а затем написать другой Z. Возможно, вы могли бы использовать несколько проходов и трафаретный буфер - рисование дыры 3 раза с настройкой рендеринга, как это может работать:

  • Проход 1: Без z-теста, Очистить трафарет под полировкой отверстия
  • Проход 2: Нормальный z-тест, Увеличение значения трафарета (где проходит тест глубины)
  • Проход 3: Очистить Z, где трафарет> 0

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

bluescrn
источник