LINUX.ORG.RU

Parallax occlusion mapping не работает, помогите понять.

 , , , , parallax occlusion mapping


0

1

Я уже обратился 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

Deleted

Последнее исправление: Deleted (всего исправлений: 10)

Ребяяятыыы, есть идеи?

Deleted
()

2 + 2 = 4 ехал ёжик по квартире

Deleted
()

Ну где же вы все гении математики которые четырёхмерные матрицы в голове трансреверсируют. Я уже на метод тыка перешёл.

Deleted
()
Ответ на: комментарий от eagleivg

Да тут не должно быть всё сложно, надо просто коллективный разум )) И да ты там патч предложил я прямо сейчас тебе там писал но пришло уведомление с лора лол, короче если юзер выполнит cmake . то затрётся оригинальный Makefile нельзя ли как то сделать что бы выхлоп был в файл иным именем и задать это в самом CmakeFile? Нельзя перезаписывать рабочие файлы! Может как опцию в обычный Makefile засунуть, а cmake-файл переименовать.

Deleted
()
Ответ на: комментарий от eagleivg

Не, не писал ещё, я там не ориентируюсь, ща напишу, поиграюсь ещё немножко, но блин оно же работает для одной оси, я просто в голове не могу эти матрицы представить что бы понять что надо менять

Deleted
()
Ответ на: комментарий от Deleted

Честно говоря, не сталкивался с таким использованием cmake. Обычно его из отдельной директории запускают...

eagleivg ★★★★★
()
Ответ на: комментарий от eagleivg

Обычно его из отдельной директории запускают…

А не надо обычно, надо креативно ))))) Так то да, но всё же, я хз.

Deleted
()
Ответ на: комментарий от Deleted

я в этом вашем гейм-деве вообще ничего не понимаю,

но ты напиши что такое fTBN, w_tangent, w_binornal, w_normal, fPosition. Если как по картинкам судить, то в вычислениях координат где-то не то не туда.

Порядок в матрицах важен

sshestov
()
Ответ на: комментарий от Deleted

а откуда у тебя оригинальный Makefile и зачем он нужен

если ты используешь систему сборки, Makefile генерируется ею

Harald ★★★★★
()
Ответ на: комментарий от eagleivg

Возможно не совсем правильный, но рабочий, вернее в моём случае рабочий только в одном положении модели для двух параллельных плоскостей. Проблема выше, а именно в данных передающихся в шейдеры атрибуты/юниформы во первых там как я смотрю расчёты все кастомные и горести добавляет что я слабо понимаю что там высчитывается и как все данные, камера,позиции в сыром виде затем они обрабатываются местами, атрибуты в VAO каждой модели над всем обёртки Даниеэль сцуко гений гад такой )))))) Надо садиться и раздуплять чё у него там происходит. Эх мля бомбонёт у меня когданить заброшу форк… Боюсь не осилю.

Deleted
()
Ответ на: комментарий от Harald

если ты используешь систему сборки, Makefile генерируется ею

make это и есть система сборки, текущий Makefile написан один раз и работает годами без проблем для 3х платформ и даже в случае отсуцтвия make в системе можно спокойно глянуть как собрать проект вообще без систем сборки, руками. Ни одна покстыльная система сборки не гарантирует тебе успешность сборки и ниодна не даст понимания как собрать самому и как происходит вообще сборка, а порой завязка на системе сборки при её отсуцтвии делает сборку воооще невозможной. Руками написанный Makefile по надёжности, простоте и удобству переплёвывает всё что когда либо было написано для автоматизации сборки (и не только). Всё иное на данный момент это костыли, за исключением тех случаев когда сценарий сборки написан на языке на котором и написана программа, тогда и только тогда она становится самодостаточной ибо ей нужно лишь одно интерпретатор или компилятор всё! А у баб должны быть длинные ноги )))))))

Deleted
()
Ответ на: комментарий от Deleted

ну так с матрицами и геометрией как раз все просто

но нужно не запутаться/облажаться: во-первых где координата какой точки (что обозначают векторы или матрицы); во-вторых в порядке координат внутри одного вектора или матрицы.

Эти упражнения будет проще и удобнее делать вместе с нами - комментаторами :)

sshestov
()
Ответ на: комментарий от deep-purple

Я сейчас пишу отдельную демку с кастомным рендером, закончу, выложу и буду дальше спрашивать. А так то да, надо все входные данные прочекать. Плохо ещё то что я вчера про эти матрицы и прочее начитался, сегодня проснулся сел и понял что я ничего во первых не понял, а во вторых не помню что читал, плак. Но я мля докопаюсь, все нервы мне уже вымотало агррр.

Deleted
()
Ответ на: комментарий от Harald

Я не осилил автотулзы потому что не могу запомнить как их писать! И бабу длинноногую я не осилил… :D Надо купить табуретку, буду повыше, побрутальней с табуреткой то! Ща код выложу для новых тестов присоединяйся к хардкорному геймдеву на сишке

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.