2011-05-05 5 views
2

J'essaie d'effectuer un rendu combiné avec OpenGL pour le rendu polygonal et CUDA pour le rendu du volume. Mon idée est de rendre la scène OpenGL dans un framebuffer, puis d'utiliser cette couleur et ce buffer de profondeur en entrée de mon moteur de rendu CUDA, en l'utilisant de la même manière qu'OpenGL, pour obtenir une composition alpha et profondeur correcte.Prise en charge de GL_DEPTH_COMPONENT pour cudaGraphicsGLRegisterImage

Cependant, je rencontre un problème. Quand j'appelle:

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)); 

Je reçois pas d'erreur sur le premier cudaGraphicsGLRegisterImage, mais une erreur « argument non valide » sur le second. Est-ce que CUDA 3.2 ne supporte pas l'enregistrement de textures de composants de profondeur? Est-ce que 4.0 (quand il sort)? Y a-t-il une autre façon d'aborder ce que j'ai manqué?

+0

Je ne pense pas qu'il existe un support de profondeur dans les textures CUDA 3.2. CUDA 4.0 introduit des "textures en couches", ce qui, je présume, permet des composants de profondeur, mais je n'utilise pas beaucoup GL interop avec CUDA, donc c'est juste une supposition. – talonmies

+0

Je pense que les "textures en couches" font référence à plusieurs niveaux de mipmap. – tkerwin

+0

Ce n'est certainement pas mipmaps - ceux-ci ne sont pas encore pris en charge dans CUDA. – talonmies

Répondre

1

L'interopérabilité de texture CUDA GL ne prend actuellement pas en charge GL_DEPTH_COMPONENT (à partir de CUDA 4.1).

Cela a malheureusement été négligé dans la documentation CUDA. Un bug de documentation a été déposé pour rectifier cela.