2015-02-16 1 views
3

Есть ли подходящий способ доступа к низкоуровневым объектам OpenGL VTK для их изменения из ядра CUDA/OpenCL с использованием функции взаимодействия OpenGL-CUDA/OpenCL?Доступ к объектам VTK OpenGL (3D текстура) из CUDA

В частности, я хотел бы получить GLuint (или беззнаковое целое) элемент из vtkOpenGLGPUVolumeRayCastMapper, который указывает на объект OpenGL 3D Texture, где хранится набор данных для того, чтобы привязать его к CUDA поверхности, чтобы быть в состоянии получить доступ и измените его значения из ядра CUDA, реализованного мной.

Для получения дополнительной информации, процесс, который я должен следовать объясняется здесь: http://rauwendaal.net/2011/12/02/writing-to-3d-opengl-textures-in-cuda-4-1-with-3d-surface-writes/ где объект texID используется там (в шагах 1 и 2) эквивалентно тому, что я хочу, чтобы извлечь из ВТК.

На первый взгляд на функции vtkOpenGLGPUVolumeRayCastMapper, я не нахожу простой способ сделать это, а не может быть, создав подкласс vtkGPUVolumeRayCastMapper, но даже в этом случае я не уверен, что я должен изменить в точности, так как я предположим, что некоторые другие члены зависят от значений 3D Texture и должны быть также обновлены после его модификации.

Итак, вы знаете, как это сделать?

Большое спасибо.

ответ

1

Подкласс может работать, но вы, вероятно, могли бы избежать его, если хотите. Важно то, что вы получаете порядок вызовов API GL/CUDA в правильном порядке.

Во-первых, вам необходимо зарегистрировать текстуру с помощью CUDA. Это делается с помощью:

cudaGraphicsGLRegisterImage(&cuda_graphics_resource, texture_handle, 
GL_TEXTURE_3D, cudaGraphicsRegisterFlagsSurfaceLoadStore); 

с оговоркой, что texture_handle является GLuint записывается вызовом glGenTextures (...)

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

Единственное, о чем вам нужно беспокоиться, это то, что vtk не использует текстуру между вызовом cudaGraphicsMapResources (...) и cudaGraphicsUnmapResources (...). Все остальное должно быть стандартным CUDA.

Кроме того, как только вы нарисуете текстуру на CUDA и напишите ей в ядре, нет дополнительной работы, кроме того, что вы хотите разметить текстуру. GL будет получать модифицированную текстуру в следующий раз, когда она будет использоваться.

+0

Благодарим за ответ, но на самом деле это не было сомнением. Основной проблемой является восстановление VTK, а не Interop. – Alex

+0

Во-первых, доступ к VTK GLuint не реализован, так как он обрабатывается как частный член. Возможно, я мог бы подклассифицировать его и создать функцию для доступа. Даже тогда возникает другая проблема. Поскольку, как считается, VTK обрабатывает статические тома, я предполагаю, что VTK создает дополнительные данные, кроме текстуры, когда создается объект тома VTK. Если я изменяю только текстуру извне (CUDA), большинство дополнительных данных, хранящихся в объекте, устареет. Таким образом, большая проблема заключается в том, как обращаться с надежностью объекта, когда он модифицируется извне, не замечая его. – Alex

+0

Я не знаком с VTK, но уверен, вы можете подклассы, пока он защищен, а не частный. Если он является приватным, как вы говорите, вы можете запросить GL для текущей связанной текстуры, но вам нужно знать, когда VTK делает вызовы glBindTexture(). Это предполагает, что вы пишете свои собственные шейдеры и не сработаете, если VTK справится со всем этим. Насколько я знаю, нет никакой информации, хранящейся в OpenGL, которая недействительна, записывая значения texel в ядре CUDA.Вычислительно дорого пересылать (устаревшие) тексели в OpenGL более одного раза, поэтому я сомневаюсь, что VTK это делает, но я не могу сказать. –

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