Я уже обратился https://github.com/orangeduck/Corange/issues/28 к разработчику движка который я форкнул, парень он клёвый, а ещё очень умный, но обычно он довольно занят, так что я продублирую вопрос тута ))
Короче наткнулся на http://apoorvaj.io/exploring-bump-mapping-with-webgl.html#normal-mapping
смотрю прикольно, дай думаю себе присобачу, но не тут то было всё кривое. Вот пример как оно выглядит https://www.youtube.com/watch?v=bK-7biXVgHk
Сама parallax фцнкция
vec2 parallax_uv(vec2 uv, vec3 view_dir)
{
float num_layers = 22;
float layer_depth = 1.0 / num_layers;
float cur_layer_depth = 0.0;
vec2 delta_uv = view_dir.xy * parallax_level / num_layers;
vec2 cur_uv = uv;
float depth_from_tex = texture2D(parallax_map, cur_uv).r;
for (int i = 0; i < num_layers; i++) {
cur_layer_depth += layer_depth;
cur_uv -= delta_uv;
depth_from_tex = texture2D(parallax_map, cur_uv).r;
if (depth_from_tex < cur_layer_depth){
break;
}
}
/*
//Step Parallax mapping
return cur_uv;
*/
// Parallax occlusion mapping
vec2 prev_uv = cur_uv + delta_uv;
float next = depth_from_tex - cur_layer_depth;
float prev = texture2D(parallax_map, prev_uv).r - cur_layer_depth
+ layer_depth;
float weight = next / (next - prev);
return mix(cur_uv, prev_uv, weight);
/*
//Simple Parallax mapping
float dep = texture2D(parallax_map,uv).z;
vec2 uvn = view_dir.xy * (dep * parallax_level);
return uv - uvn ;
*/
}
- Вариант 1 Расчёты позиций в фрагментном шейдере (не по канону) Тут на коробке корректно отображаются только две противоположные стороны выглядит это так https://youtu.be/bK-7biXVgHk?t=77
остальные вообще непонятно кривят, но это хоть частично работает сам код https://github.com/fedor-elizarov/parallax_data/blob/master/assets_core/shaders/deferred/static.fs
mat3 TBN=transpose(mat3(normalize(fTBN[0]),
normalize(fTBN[1]),
normalize(fTBN[2])));
vec3 position = normalize(camera_position - fPosition);
vec3 ViewPos = TBN * position;
ViewPos.y = -ViewPos.y;
/*calculate from fragment shader*/
//Variant 1
uvs=parallax_uv(uvs, ViewPos); // correct 2 plane in box
- Вариант 2 Расчёты позиций в вершинном шейдере с интерполированным возвратом (по канону) вообще всё криво, но! все стороны подчиняются одинаковым искажениям, но лбом об стену и так и сяк никак не работает корректно сам код тут https://github.com/fedor-elizarov/parallax_data/blob/master/assets_core/shaders/deferred/static.vs
//vs
mat3 TBN= transpose(mat3(normalize (w_tangent),
normalize (w_binormal),
normalize (w_normal)));
fTanFragPos = TBN * fPosition;
fTanViewPos = TBN * camera_position;
fTanViewPos = normalize(fTanViewPos - fTanFragPos);
fTanViewPos.y = -fTanViewPos.y;
//fs
/*calculate from vertex shader*/
//Variant 2
uvs = parallax_uv(uvs,fTanViewPos); // all planes in box is broken
И ещё раз ссылку на видео где характер искажений виден https://www.youtube.com/watch?v=bK-7biXVgHk
Вот рабочая сборка для примера https://github.com/fedor-elizarov/parallax_data
запустить ./parallax и из каталога ./assets/deep/ мышкой перетащить obj и или mat файлы
Ткните палочкой где я недосмотрел? Если в первом варианте всё работает корректно только для двух сторон то проблема в TBN? он неверно расчитан? А как тогда правильно?
Так я запилил вторую демку там уже можно просто открыть ./assets/deep/parallax.vs
и ./assets/deep/parallax.fs
и заимплементировать в parallax.c
кастомный рендер в обход основного из движка. Если у кого руки чешутся помочь parallax этот багрённый заимплементить велкам ))))))))))
https://github.com/fedor-elizarov/parallax_data/ (version2)
- UDP: It woked!
Короче аллилуя, проблема решилась расчётом TBN в вершинном шейдере, реверсе значений камеры x to y, y to x и последующем инфертировании в отрицательное значение позиции камеры по y (изначально x соотвецтвенно) если кто-то форкал Corange думаю будет это полезно знать рабочий код parallax околюжена тут https://github.com/fedor-elizarov/parallax_dataА тут видяшка как всё работает https://youtu.be/FUYzaYnRJWY