HLSL полупрозрачный пластиковый шейдер

12

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

Эффект, который я собираюсь получить, похож на свет, проходящий через абажур, похожий на эти картинки:

альтернативный текст альтернативный текст альтернативный текст

В идеале я мог бы контролировать силу и цвет света, чтобы заставить его пульсировать и вращаться с помощью нескольких ярких ярких цветов

Хотя я не уверен, с чего начать!

Мой вопрос: знает ли кто-нибудь методы, которые я должен исследовать, чтобы иметь возможность создать такой шейдер, или есть пример того же / подобного шейдера, который я могу использовать в качестве отправной точки? Или даже если вы хотите предоставить шейдер, который мог бы выполнять эту работу

Тристан
источник

Ответы:

10

Этот эффект известен как «Подповерхностное рассеяние».

В книге «GPU Pro: Продвинутые методы рендеринга» приведен пример реализации этого в пространстве экрана, который подходит для использования в реальном времени.

Тони Маккрири
источник
0

Я не знаю HLSL, поэтому не могу дать точного ответа. Что вы в основном можете сделать, это установить цвет каждого фрагмента в зависимости от расстояния от источника света (игнорируя любое самозатенение).

В псевдокоде это будет примерно так:

фрагмент_цвет = свет_интенсивность * прозрачность_цвет * источник света_цвет / (ослабление * расстояние_всвет источника ^ 2)

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

Danik
источник
0

Должен ли свет уметь двигаться, а объект должен уметь деформироваться / одушевляться? Если это не так, дешевый способ сделать это - применить монохромную текстурную карту к объекту, который действует как маска для света; в шейдере вы должны отобрать эту текстуру, умножить ее на текущий цвет / силу света и добавить к выходному цвету.

Очевидный последующий вопрос: как вы будете генерировать эту текстуру? Вы можете попробовать нарисовать его, если у вас есть доступ к художнику или вы можете рисовать текстуры самостоятельно. Он также может быть визуализирован автономным инструментом, использующим трассировку лучей или что-то подобное. Однако я недостаточно знаком с инструментами трассировки лучей, чтобы подробно рассказать, как их настроить.

Другой подход может состоять в том, чтобы написать шейдер, который будет отбирать свет за ним, используя нормаль обратной поверхности в регулярном уравнении диффузного затенения Ламберта; затем вы умножите его на некоторый коэффициент маски, например, 0,5 или около того, и добавите к выходному цвету. Это позволило бы динамически перемещать свет или геометрию и не требовало бы текстур, но вы, вероятно, не получили бы такие же хорошие результаты, как автономный рендер.

Что касается подповерхностного рассеяния: я не думаю, что это именно то, что здесь нужно, потому что все алгоритмы SSS для графики, которые я видел, предназначены для света, который исходит снаружи , немного подпрыгивает и снова выходит, а здесь свет внутри ,

Натан Рид
источник