Я пытаюсь выполнить комбинированный рендеринг с 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 (когда выйдет)? Есть ли другой способ приблизиться к этому, что мне не хватает?