2011-12-17 8 views
1

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

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

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

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

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

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

2.how может я применять его на VBO и передать его (cudaRegisterBuffer CUDA или что-то подобное)

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

+0

С 'glBegin/glEnd' вы также копируете все данные на графический процессор в каждый кадр, но в этом случае с тяжелым syscall для каждой отдельной вершины. Так что да, VBO всегда верный путь, тем более, если вычисление выполняется CUDA, и в этом случае нет необходимости копировать данные VBO в CPU когда-либо. –

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^