Облік хвиль при виконанні плоских відбитків


13

Я вивчав приклади Nvidia з SDK, зокрема проект Island11, і знайшов щось цікаве про фрагмент коду HLSL, який виправляє відображення вгору і вниз залежно від стану висоти хвилі.

Природно, вивчивши короткий абзац коду:

// calculating correction that shifts reflection up/down according to water wave Y position
float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix);
float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;
projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix);
waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;
reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y);

Моя перша здогадка полягала в тому, що вона компенсує площинне відбиття, коли воно піддається вертикальному збуренню (хвилі), зміщуючи відображену геометрію до точки, де нічого немає, і вода просто подається так, ніби нічого там немає або просто неба:

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

Тепер це небо відображає те, де нам слід побачити зелене / сіре / жовтувате відбиття місцевості, висвітлене базовою лінією води. Моя проблема полягає в тому, що я не можу реально визначити, яка логіка лежить в основі. Проектуючи фактичне положення світового простору точки хвилі / водної геометрії, а потім помноживши на -5f, лише взявши іншу проекцію тієї ж точки, на цей раз з його координатою y змінили на -0,8 (чому -0,8?).

Підказки в коді, схоже, вказують на те, що він був отриманий із спробою та помилками, оскільки є надмірність. Наприклад, автор бере негативну половину проектованої координати y (після w ділення):

float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w;

А потім робить те ж саме для другого пункту (тільки позитивний, щоб отримати якусь різницю, я припускаю) і поєднує їх:

waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w;

Видаляючи поділку на 2, я не бачу різниці в поліпшенні якості (якщо хтось дбає про те, щоб мене виправити, будь ласка, зробіть) Суть її, здається, полягає в різниці в прогнозованому y, чому це так? Ця надмірність і, здавалося б, довільний вибір -8f та -0.15f приводять мене до висновку, що це може бути поєднанням евристики / роботи. Чи є логічне підґрунтя цьому чи це просто відчайдушний злом?

Тут перебільшення початкової проблеми, яку вирішує фрагмент коду, спостерігайте на найнижчому рівні тесселяції. Сподіваюсь, це може викликати ідею, якої я відсутня. -8f може бути еталонною висотою, з якої можна вивести, наскільки порушити вибірку координат текстури, відображення плоско відображеної геометрії, а -.15f може бути нижньою межею, мірою безпеки.

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

Відповіді:


1

Ця техніка обов'язково має цей артефакт, і саме тому більшу частину часу, коли він використовується, ми застосовуємо вертикальний зсув у пошук, щоб зробити так, якби фактична площина відбиття була на півметра вище її реального положення. Так, він має недолік у тому, що не має ідеально відповідного відображення, але він є кращим для отворів.


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