WebGL геометрические взаимодействия - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть динамическая поверхность в WebGL, которая анимирована в вершинном шейдере. Я хочу, чтобы другие объекты взаимодействовали с этой поверхностью (например, объект, движущийся по динамической местности). Какой лучший способ сделать это? Должны ли все эти вычисления выполняться на процессоре? Есть ли способ рассчитать этот материал на GPU?

По сути, мне нужен вершинный шейдер с доступом к другим (уже преобразованным) вершинам - это было бы идеально.

1 Ответ

1 голос
/ 26 сентября 2011

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

Лучше всего реализовать такие вещи (например, обнаружение столкновений) на процессоре. В JavaScript он очень медленный, и вам нужно долго и усердно думать о лучшем алгоритме для вашей сцены, но я думаю, что это единственное, что действительно сработает.

Хорошим началом было бы использование пространственного разделения (примеры: octree , BSP - разделение двоичного пространства - дерево ). Я пока не проводил никаких сравнительных тестов, но у меня есть предчувствие, что BSP-деревья будут более эффективными, чем окт-деревья в большинстве сцен JavaScript. Часто в целом выполняется меньше проверок и, возможно, гораздо меньше рекурсии. Кроме того, деревья BSP предоставляют вам практически уникальную возможность обрабатывать геометрию сзади-спереди или спереди назад относительно любой произвольной точки пространства без необходимости постоянно сортировать и повторно сортировать геометрию. Недостаток деревьев BSP (и октеров в меньшей, но все же нетривиальной степени) состоит в том, что их геометрия должна оставаться статической. То есть перемещение отдельных треугольников на лету не очень хорошо работает с этими деревьями, потому что тогда геометрия делает должна быть пересортирована. Я не думаю, что статическая природа пространственного разделения является особенно проблематичной, если анимации ваших сеток относительно просты, незначительны и предсказуемы (например, флаг развевается на ветру), но если они более сложны (например, рушатся). строительные или падающие камни), тогда эти типы пространственных перегородок могут вообще не подходить вам.

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

Обновление: на самом деле, есть один способ, которым вы могли бы "любить" сделать это хотя бы частично в шейдере. В частности, в отношении вашего примера объекта, движущегося по динамической местности, вы можете реально отрендерить эту динамическую местность в закадровый кадровый буфер, затем отобразить положение объекта в том же кадровом буфере и использовать readpixels () для считывания высоты ландшафта в точке эта позиция. Это будет работать только для карт высот, и кадровый буфер, очевидно, необходимо будет обновлять каждый раз при изменении ландшафта (если вообще когда-либо). Тем не менее, это был бы относительно простой способ увидеть, как высоко объект должен быть расположен на динамической местности без необходимости создавать сам процесс создания ландшафта на CPU. Это не было бы истинным обнаружением столкновения, хотя, и объект все еще подвергался бы другим проблемам (таким как наличие одного колеса на или под землей и одного колеса в воздухе) Вы могли бы обойти эти проблемы, но решение было бы нетривиальным, вероятно, включающим многократные проверки данных кадрового буфера.

...