Size: a a a

RU Rust GameDev — русскоговорящее сообщество

2020 December 24

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
Alexander Tchitchigin
Что-то недопонял, при чём тут вообще полигоны? 🤷‍♀️😊
Я имею ввиду, что сложность выяичлсения нормалей сводится к вопросу сложности вычисления самой SDF, а она может быть достаточно сложной. Она даже в ShaderToy у людей не маленькая получается. А попробуйте SDF задать, например, весь Skyrim целиком :)
источник

AT

Alexander Tchitchigi... in RU Rust GameDev — русскоговорящее сообщество
Ilya Lakhin
Я имею ввиду, что сложность выяичлсения нормалей сводится к вопросу сложности вычисления самой SDF, а она может быть достаточно сложной. Она даже в ShaderToy у людей не маленькая получается. А попробуйте SDF задать, например, весь Skyrim целиком :)
С этим согласен. Для больших пространств придётся разбивать на кубы или ещё что-то.
источник

p

polunin.ai in RU Rust GameDev — русскоговорящее сообщество
Ilya Lakhin
А как именно путь с поверхностью пересечь?
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects

Рейтресингом же
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
polunin.ai
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects

Рейтресингом же
Ну тут вопрос в том, как вы intersect искать по sdf будете без реймарчинга именно )
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
Реймарчинг - это методика(и) поиска пересечения луча с поверхностью, о которой мы знаем только её SDF
источник

AT

Alexander Tchitchigi... in RU Rust GameDev — русскоговорящее сообщество
polunin.ai
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects
let objects = findAll (\obj -> intersect obj ray) objects in
 findClosest objects

Рейтресингом же
Только не findClosest, а sortByDistance. 😉
источник

AT

Alexander Tchitchigi... in RU Rust GameDev — русскоговорящее сообщество
Ilya Lakhin
Ну тут вопрос в том, как вы intersect искать по sdf будете без реймарчинга именно )
Откуда там objects и в каком они виде — тоже вопрос любопытный. 😊
источник

AT

Alexander Tchitchigi... in RU Rust GameDev — русскоговорящее сообщество
Ilya Lakhin
Реймарчинг - это методика(и) поиска пересечения луча с поверхностью, о которой мы знаем только её SDF
Ну и чтобы не мелочиться, не одной поверхностью, а всеми сразу.
источник

AT

Alexander Tchitchigi... in RU Rust GameDev — русскоговорящее сообщество
Alexander Tchitchigin
Только не findClosest, а sortByDistance. 😉
Неправильно прочитал, замечание снимается.
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
Просто если есть объекты в каком-то явно заданном простом виде, то конечно нам ни реймарчинг, ни SDF не нужны. Вопрос весь в том, где такие объекты взять. В примерах с рейтрейсингом там обычно рисуют простые примитивы типа кубойдов и эллипсойдов. Для них SDF конечно не нужен. А если хочется что-то более сложное, ну, например, поверхность человеческой головы, то тут либо нанимать художника, который всё это нарисует в Блендере, и экспортирует в полигоны, либо как-то иначе. Ну вот SDF позволяет до некоторой степени это "как бы иначе" получить без привлечения стороннего человека. Тут чисто утилитарная причина.
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
Конечно голову рисовать на sdf-ах тоже возни будет не мало, но тут по крайней мере мы можем делать скалптинг буквально на месте, путем самого программирования
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
И, причем, учитывая что мы для скалптинг пишем алгоритм, а не просто получаем одну конкретную модель, мы по идее можем сделать его достаточно generic, в смысле получить алгоритм-фреймворк с некоторыми вводными параметрами, которые будут давать разный результат по разным параметрам. Что автоматически даёт возможность получить не одну голову, а сразу сотню разных.
источник

IL

Ilya Lakhin in RU Rust GameDev — русскоговорящее сообщество
Опять же, этого можно добиться и полигональной графикой, разными там аттракторами, скелетами и прочим, но это будет по меньшей мере не легче, чем делать на SDF
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
Ilya Lakhin
Ну да, как Саша выше написал. SDF функция ведь непрерывно дифференцируемая, значит градиент можно взять численной аппроксимацией.

Ну и да, в реймарчинге всё жутко дорого. Это совершенно не техника для реалтайм-графики. Поэтому её в мейнстриме и не используют.
В анриле используется для мягких теней, но там считается 3д текстурка и ничто не мешает рядом запечь ещё и текстурку с градиентом
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
я вот запостил ссылку и уже не уверен как там делается)
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
но вроде было что-то с текстурами. Ну и для теней не нужен градиент
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
Each level that you create is made up of all these Mesh Distance Fields for your placed Actors. When Mesh Distance Fields are generate, they are done so "offline" using triangle raytracing that stores the results in a volume texture. Because of this, mesh distance field generation cannot be done at runtime. This method computes the Signed Distance Field rays in all directions to find the nearest surface and stores that information.
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
короче да, для статических мешей вольюм текстурка
источник

ВМ

Виталий Медоваров... in RU Rust GameDev — русскоговорящее сообщество
Из похожего в POE тоже сдф-подобный алгоритм для травки используется с запечённой текстурой https://gamedev.ru/code/articles/grass_raycast
источник