Як я можу включити фізику до процесу, що генерується, із шейдера геометрії?


10

По суті, я хочу зняти необхідність генерувати узгоджений шум з процесора до GPU. Звідти я також хочу генерувати місцевість для тривимірного світу, використовуючи цей шум як щільність у точках вокселів. Після цього я хочу взяти ці щільності і полігонізувати (генерувати вершини) їх, що представляють місцевість світу.

Це добре і все. Але я також хочу динамічно деформувати світ у режимі реального часу. Як тільки я дійшов до цього моменту, у мене виникає проблема, намагаючись повернути вершини до процесора, щоб зробити такі дії, як виявлення зіткнень та всі ігрові обчислення, які я хочу залучати до процесора, а не до процесора.

Отже, питання полягає в тому, як я можу повернути підмножину вершин до центрального процесора для вирішення зіткнень серед іншого?

І ще одне питання: чи є простий спосіб взяти набір вершин і генерувати з них індекси на GPU?

Я збентежений, а також щодо того, які шейдери я повинен використовувати для цих різних речей. Я чую, як люди використовують піксельний шейдер для збору щільності, а потім використовують шейдер для геометрії для роботи з генерацією місцевості з вершин, а потім якимось чином включають вершинний шейдер, щоб зробити динамічні деформації.

Я використовую C # 4.0, .NET 4.0 та XNA Game Studio 4.0.


1
Ви говорите, що в заголовку ви використовуєте шейдер для геометрії, але ви також говорите, що для використання XNA4.0, наскільки я знаю, для XNA 4.0 потрібен DirectX 10 (щоб спростити розробку для більш рівномірної платформи), але підтримує лише функції SM3.0, тому немає шейдера геометрії. forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

І тепер я більше не буду використовувати XNA або переробляти свій дизайн. Дякуємо, що вказали на це. Я розглядав це і не усвідомлював цього обмеження (немає SM 4). Я вважаю, що питання все ще залишається, хоча без врахування XNA.So, лише з точки зору DirectX, є спосіб зробити те, що я хочу? А може, з вершинним шейдером у XNA?

1
Добре використовувати XNA, як і раніше, якщо у вас є перевірений тестовий випадок, коли деформації та генерація занадто повільні. І що ви довели на іншому тестовому прикладі, що GPU деформується + покоління, а потім повернення даних до процесора швидше :)
Roy T.

Справді. Ми виявили, що використання XNA та збереження всього на процесорі дало нам близько 1 мільйона вершин приблизно за три хвилини на Core i7 з 8 ядрами та 8 нитками, що паралелізували кілька ділянок місцевості на одну нитку. Намагаючись зробити це в режимі реального часу і, сподіваємось, рендерингу місцевості до того, як гравець зможе це побачити, ми досягли приблизно 20 кадрів в секунду. Отже, тестовий випадок, безумовно, в порядку з кожним із методів.
Майкл Дж. Грей

Відповіді:


3

Оскільки XNA не підтримує шейдери геометрії, я відповім на нього так, як якщо б ви використовували DX 10. У вас, по суті, є три варіанти.

Шейдери для геометрії Шейдери для геометрії можуть фактично змінювати та додавати вершини до вершинного буфера. Ви можете прочитати це назад в процесорі. Я не розглядав це, але це, безумовно, можливо.

Просто використовуйте процесор По-друге, чому б вам просто не обчислити його на процесорі? Той факт, що він працює на графічному процесорі в шейдерах, говорить про те, що ваш алгоритм деформації є локалізованим, тобто ви можете легко генерувати лише відповідні частини для перевірки зіткнення.

Наприклад, я зробив парусну гру деякий час тому. Океан використовував вершинні та геометричні шейдери для деформації води хвилями. Я використовував той же алгоритм, розрахований на процесорі, лише за декілька точок під човником для руху човна по хвилях. Я впевнений, що ви могли б зробити щось подібне для своєї карти вокселів.

Піксельні шейдери Останній варіант, про який ви також згадували у своєму запитанні: генеруйте густину в піксельній шейдері та запишіть її на тривимірну текстуру. Ви можете отримати доступ до цього з процесора та шейдерів досить нешкідливо. Піксельний шейдер ідеально підходить для цього завдання, але цей метод має великі накладні витрати. Надання текстури гучності, а також відбір проб у вершині та гео. шейдерів і зчитування текстури на процесорі.

Я не знаю специфіки вашого проекту, але я завжди використовую для цього процесор. В будь-якому випадку, також обчислюйте щільність на шейдерах, але дотримуйтесь використання графічної карти для візуалізації.


Головною проблемою у нас був бар’єр GPU-CPU. У сенсі, коли ми генеруємо та рендеруємо місцевість на GPU, як ми з'ясуємо, як виглядає місцевість на стороні процесора для того, щоб робити зіткнення та інші речі. Я гадаю, ваша думка про збереження його на процесорі справедлива. Я маю на увазі, ми, мабуть, можемо досить оптимізувати наш алгоритм і створити менше рельєфу. Я позначу вашу відповідь як рішення через день чи два, щоб побачити, чи є хтось ще у відповіді. Дякуємо за те, що ви спровокували деякі альтернативні думки.
Майкл Дж. Грей

З вашим прикладом вітрильного спорту ви не зможете легко підключити результат сигналу човна, що плескається хвилями, до графіка?
deceleratedcaviar

1
Ви можете зберігати ту саму систему візуалізації, тобто генерувати та рендерувати місцевість на графічному процесорі, але дзеркально відображати потрібні частини місцевості на процесорі. Використовуючи той самий алгоритм і ті ж параметри, ви отримаєте таку ж місцевість на процесорі, як і на екрані.
Ганнеш

@Daniel Не за допомогою хвильового алгоритму безпосередньо, але можна деформувати водяну сітку відповідно до хвилі човна зі зміщенням текстури, яку кожен човен "тягне" за собою.
Hannesh

Ах! Це чудова ідея :). Але це, ймовірно, не дуже добре підтримує кілька водних апаратів.
deceleratedcaviar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.