Рисование карты высот OpenGL с использованием CUDA VBO - PullRequest
1 голос
/ 17 декабря 2011

Я задал здесь несколько вопросов, касающихся VBO, и, исходя из полученных комментариев, я решил, что необходимо применить новый подход.

Проще говоря - я пытаюсь нарисовать набор Мандельброта, который определен в большом массиве FLOAT, около 512X512 точек. Цель моей программы - позволить пользователю управлять масштабированием и ориентацией в мире (это 3d модель). до сих пор я рисовал все это, используя GL_TRIANGLE_STRIP, который оказался плохим выбором из-за медленного процесса рисования. также потому, что реализация моего стиля рисования (порядок вызова glVertex) стала невозможной для кодирования для VBO.

поэтому у меня есть несколько вопросов.

даже после этого описания я не уверен, что VBO является лучшим выбором, потому что пользователь должен контролировать вычисления. Для каждого вычисления, которое он вызывает программой, я должен пересчитать набор Мандельброта (~ 60 мс) и скопируйте точки в буфер: процесс, который занимает некоторое время (? мс).

программа также позволяет пользователю перемещаться по миру, поэтому здесь не производятся никакие вычисления, поэтому VBO - отличный выбор.

1. Как лучше всего нарисовать карту высот (когда каждая ячейка в массиве содержит только высоту)

2.Как я могу применить его на VBO и перенести в cuda (cudaRegisterBuffer или что-то в этом роде)

3.Есть ли способ отличить режим и решить, когда нужны VBO (в режиме без вычислений), а когда нет (режим вычислений).

1 Ответ

1 голос
/ 19 декабря 2011

Вам не нужно копировать данные CUDA каждый кадр, если вы связываете массив / VBO CUDA с DirectX / OpenGL VB (подробности см. В руководстве по программированию CUDA).Одним из способов визуализации данных в виде поля высоты является использование геометрического шейдера для создания трис на основе поля высоты.Другой способ - использовать поле высоты в качестве параллакс-карты (см. DirectX SDK).Моим любимым делом было бы сделать ваше поле высоты массивом позиций (X / Y / Z) и использовать CUDA для изменения только Y-значений, а затем использовать индексный буфер для определения полигонов, составляющих поверхность.Обратите внимание, что вам также необходимо обновить нормали вершин, и вы также можете использовать XYZ / UV, если вы хотите текстурировать поверхность.Если 512x512 слишком велико, используйте растровые операции (выборка текстуры), чтобы заполнить поле высоты с более низким разрешением интересующей области.Вы можете выполнить этот этап в CUDA или OpenGL / DirectX (я бы рекомендовал сделать это в CUDA, где вы можете легко написать свое собственное ядро ​​сэмплирования для поиска пикселей при понижающей дискретизации).

...