Поддержка GL_DEPTH_COMPONENT для cudaGraphicsGLRegisterImage

Я пытаюсь выполнить комбинированный рендеринг с OpenGL для полигонального рендеринга и CUDA для объемного рендеринга. Моя идея состоит в том, чтобы визуализировать сцену OpenGL в буфер кадра, а затем использовать этот буфер цвета и глубины в качестве входных данных для моего средства визуализации CUDA, используя его так же, как это делает OpenGL, поэтому я получаю правильную композицию альфа-канала и глубины.

Однако у меня возникла проблема. Когда я звоню:

glGenTextures(1, &m_tex_color);
glGenTextures(1, &m_tex_depth);

glBindTexture(GL_TEXTURE_2D, m_tex_color);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_iWidth, m_iHeight, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, m_tex_depth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, m_iWidth, m_iHeight, 0,  
             GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffersEXT(1, &m_fbo);
glBindFramebuffer( GL_FRAMEBUFFER, m_fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, m_tex_color, 0 );
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                       GL_TEXTURE_2D, m_tex_depth, 0 );
cudaError_t b;
b = cudaGraphicsGLRegisterImage(&m_cuda_color_resource, m_tex_color,
                                GL_TEXTURE_2D, cudaGraphicsMapFlagsNone);
printf("%s",  cudaGetErrorString(b));
b = cudaGraphicsGLRegisterImage(&m_cuda_depth_resource, m_tex_depth,
                                GL_TEXTURE_2D, cudaGraphicsMapFlagsNone);
printf("%s",  cudaGetErrorString(b));

Я не получаю ошибки на первом cudaGraphicsGLRegisterImage, но ошибка «недопустимый аргумент» на втором. CUDA 3.2 не поддерживает регистрацию текстур компонентов глубины? Есть ли 4.0 (когда выйдет)? Есть ли другой способ приблизиться к этому, что мне не хватает?


person tkerwin    schedule 05.05.2011    source источник
comment
Я не думаю, что в текстурах CUDA 3.2 есть поддержка глубины. CUDA 4.0 вводит многослойные текстуры, которые, как я полагаю, позволяют использовать компоненты глубины, но я не особо использую GL-взаимодействие с CUDA, так что это всего лишь предположение.   -  person talonmies    schedule 06.05.2011
comment
Я думаю, что многослойные текстуры относятся к нескольким уровням MIP-карт.   -  person tkerwin    schedule 06.05.2011
comment
Это определенно не мипмапы — они пока вообще не поддерживаются в CUDA.   -  person talonmies    schedule 06.05.2011
comment
Страница 4.0RC2 документа для cudaGraphicsSubResourceGetMappedArray говорит об уровнях MIP-карт. Хотя мне это не очень помогает, к сожалению.   -  person tkerwin    schedule 06.05.2011
comment
Многослойные текстуры не относятся ни к текстурам глубины, ни к MIP-картам. многослойные текстуры — это форма трехмерной текстуры (двухмерная текстура с несколькими слоями). текстуры глубины действительно могут не поддерживаться. вам нужно использовать текстуру RGBA8 и глубину пакета для цвета в шейдере (используйте несколько целей рендеринга).   -  person the swine    schedule 15.01.2012


Ответы (1)


Взаимодействие текстур CUDA GL в настоящее время не поддерживает GL_DEPTH_COMPONENT (начиная с CUDA 4.1).

К сожалению, это было упущено из виду в документации CUDA. Для исправления этого была зарегистрирована ошибка документации.

person harrism    schedule 22.02.2012