Вогнетривка шейдер для скла


10

У мене є нескінченний шестикутний підлогу, породжений тесселяцією точкової сітки в парі шейдерних тесселяцій:

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

Зауважте, що це плоский каркас - "тіні" є світловим фокусом:

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

Тепер я хотів би, щоб це здавалося товстим, заломлюваним склом, але я не знаю, як діяти.

Перше, що прийшло в голову - це

  1. встановити форму, що містить запитувану "товщину" блоків
  2. Розраховуючи освітлення, використовуйте закон Снелла, щоб обчислити довжину оптичного шляху, який промінь проходив би через шестигранний блок, якби він насправді був настільки ж товстим, як говорить уніформа "товщини", і підсумовуйте альфа по цій довжині. Це дало б прозорість, але не справляється з такими речами, як внутрішнє відображення / МДП тощо.

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

Я ще цього не пробував, тому не впевнений, який би був візуальний результат.

Зрештою, саме для цього рівня я намагаюся отримати той скляний, шестикутний вигляд підлоги, який використовується у Tron: Legacy під час битви на диску. ( Для прикладу дивіться це зображення .)

Пропозиції?


1
Чи можете ви пояснити більше, якого виду намагаєтесь досягти? Постріл Tron демонструє в основному відбиття, AFAICT, а не заломлення - на більшості знімків насправді ви не можете побачити кріплення підлоги. Якщо припустити, що ви не хочете просто блискучої поверхні, що ви хочете бачити крізь підлогу? Чи є текстура підлоги, яку ви хочете показати? Чи є ціла сцена під підлогою (як у Трону)? Або ви хочете, щоб це більше нагадувало матове скло, де ви не бачите чіткого зображення, але має ефект розсіювання під поверхнею?
Натан Рід

Підземні розсіювання, хоча я не знав, що це називається. Полегшує гуглінг. :)
3Dave

Відповіді:


4

Ця стаття в GPU Gems детально розглядає заломлення, що може дати досить приємні результати

(a) Повна прозорість (b) Вогнетривке скло

У самому базовому сенсі

Перший крок основної техніки заломлення - перетворити геометрію сцени в текстуру, пропустивши всі заломлюючі сітки. Ця текстура може бути використана для визначення того, які об’єкти видно за заломлюючими об'єктами, які будуть надані в наступному проході. Ми позначимо цю текстуру як S.

Другий крок - надання рефракційних сіток, пошук значень текстури S із збуренням, застосованим для імітації заломлюючого вигляду. Збурення можна досягти, використовуючи звичайну карту N, де компоненти червоної та зеленої (XY) звичайної карти звичайної карти використовуються та масштабуються на деяке невелике значення, щоб додати зміщення в проектовані координати текстури. Цей підхід просто реалізувати в шейдері:

  1. отримати текстуру N
  2. використовувати компоненти XY, масштабовані на невелике значення (наприклад, 0,05)
  3. додайте це значення переміщення до проектованих координат текстури для S

Наступний перелік показує шейдер, який демонструє такий підхід

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

Наступні зображення ілюструють ці три дії

Три кроки, перелічені в шейдері вище

У цій же статті є більш досконалі методи, які можуть досягти набагато привабливішого вигляду


Для подібного ефекту в Unity, ви можете подивитися на вікі-сторінці The Refraction Shader


3

Я візьму зображення, яке ви показали, як орієнтир для того, як я уявляю ефект. Алгоритм, про який я можу придумати, простий:

  1. Перетворіть навколишнє середовище в куб текстури карти, щоб імітувати відображення середовища.
  2. Нанесіть текстуру карти куба в площину, яка представляє шар нижче заломлюючої підлоги. Поки не видавайте літак.
  3. Перетворіть площину в текстуру, звичайну 2D текстуру.
  4. Передайте текстуру заломлювальній шейдеру, що використовується для надання заломлення заломлення.
  5. Тепер зробіть заломлюючі сітки / підлогу заломлювальним шейдером.

Що стосується шейдера заломлення, впорядкуйте, щоб імітувати скло, яке ви можете зробити

  • Використовуйте термін френеля для імітації відбиття та заломлення.
  • Використовуйте карту нормалів / звичайних карт, щоб зробити фактур текстури.

Я просто думав про цю ідею, тому не перевіряв її. Я впевнений, що їй потрібно більше роботи, можливо, я зроблю, як тільки повернусь з роботи.


Цікавий підхід - мені доведеться трохи тушкувати на цьому. Дякуємо за вклад.
3Dave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.