Я вивчав приклади 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 може бути нижньою межею, мірою безпеки.