По сути, я хочу устранить необходимость генерации когерентного шума от процессора к графическому процессору. Оттуда я также хочу создать ландшафт для трехмерного мира, используя этот шум в качестве плотности в точках вокселей. После этого я хочу взять эти плотности и полигонизировать (генерировать вершины) их, представляющие ландшафт мира.
Это нормально и все. Но я также хочу динамически деформировать мир в режиме реального времени. Как только я дошел до этого момента, у меня возникла проблема с попыткой вернуть вершины в ЦП, чтобы выполнить такие вещи, как обнаружение столкновений и все игровые вычисления, которые я хочу задействовать на ЦП, а не на ГП.
Таким образом, вопрос заключается в следующем: как я могу вернуть подмножество вершин обратно в ЦП для решения конфликтов между прочим?
И еще один вопрос: есть ли простой способ взять набор вершин и сгенерировать из них индексы на GPU?
Я не совсем понимаю, какие шейдеры мне следует использовать для этих разных вещей. Я слышал о людях, которые используют пиксельный шейдер для сбора плотностей, а затем используют геометрический шейдер для работы с генерацией рельефа из вершин и затем каким-то образом включают вершинный шейдер для создания динамических деформаций.
Я использую C # 4.0, .NET 4.0 и XNA Game Studio 4.0.
Ответы:
Поскольку XNA не поддерживает геометрические шейдеры, я отвечу так, как если бы вы использовали DX 10. У вас по сути есть три варианта.
Геометрические шейдеры Геометрические шейдеры могут фактически изменять и добавлять вершины в буфер вершин. Вы можете прочитать это обратно в процессор. Я не смотрел на это, но это определенно возможно.
Просто используйте процессор Во-вторых, почему бы вам просто не рассчитать его на процессоре? Тот факт, что он работает на графическом процессоре в шейдерах, говорит о том, что ваш алгоритм деформации локализуем, то есть вы можете легко генерировать только соответствующие части для проверки коллизий.
Например, я сделал парусную игру некоторое время назад. Океан использовал вершинные и геометрические шейдеры, чтобы деформировать воду волнами. Я использовал тот же алгоритм, рассчитанный на процессоре всего в нескольких точках под лодкой, для движения лодки по волнам. Я уверен, что вы могли бы сделать что-то подобное для вашей воксельной карты.
Пиксельные шейдеры Последний вариант, который вы также упомянули в своем вопросе: создайте плотности в пиксельных шейдерах и запишите их в 3D-текстуру. Вы можете получить доступ к этому из процессора и шейдеров довольно безобидно. Пиксельный шейдер идеально подходит для этой задачи, но у этого метода много накладных расходов. Рендеринг текстуры объема, а также выборка из in в вершине и гео. шейдеры и необходимость читать текстуры на процессор.
Я не знаю специфику вашего проекта, но я бы всегда использовал для этого процессор. Во что бы то ни стало рассчитайте плотность и на шейдерах, но придерживайтесь графической карты для рендеринга.
источник