Хочу сделать для воды с дисплейсментом по 3-м осям корректный расчёт нормали.
Расчет нормали по вершинам работает точно, но естественно зависит от кол-ва вершин на экране и не сглаживается.
Синтаксис:
Используется csharp
half3 n = normalize(cross(ddx(i.vertexPos.xyz), ddy(i.vertexPos.xyz)));
Хочу вынести расчёт нормали в отдельную текстуру (как делают все нормальные люди).
И тут я уже туплю второй день.
Просто нормаль по высоте (без учёта смещения) расчитываю так.
Синтаксис:
Используется csharp
float s11 = tex2D(_DispTex, i.uv).y;
float s01 = tex2D(_DispTex, i.uv + float2(-_DispTex_TexelSize.x, 0)).y;
float s10 = tex2D(_DispTex, i.uv + float2(0, _DispTex_TexelSize.y)).y ;
float3 va = (float3(float2(2, 0), s11 - s01));
float3 vb = (float3(float2(0, 2), s11 - s10));
float3 n= normalize(cross(va, vb));
Но у меня высота меняется ещё относительно координат xz. Я пробовал брать tex2D(_DispTex, i.uv).xyz, пробовал к uv добавлять смещение. Всё не корректно.
Как правильно рассчитать нормаль со смещением?