I just spent some time to figure out the necessary formats for the cudaGraphicsGLRegisterImage function, so wanted to share some experience. I didnt find any example on the internet for the proper parameters so I post some of them below:
GLuint volumetexture;
int size = 16*16*16*4*4;
GLubyte *data = new GLubyte;
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1, &volumetexture);
glBindTexture(GL_TEXTURE_3D, volumetexture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
//Example 1: a float 32 rgba texture
glTexImage3D(GL_TEXTURE_3D, 0,GL_RGBA32F, 16, 16,16,
0, GL_RGBA, GL_FLOAT,data);
//Example 2: an int 32 rgba texture
glTexImage3D(GL_TEXTURE_3D, 0,GL_RGBA32UI, 16, 16,16,
0, GL_RGBA_INTEGER, GL_UNSIGNED_INT,data);
//Example 3: an int 8 rgba texture
glTexImage3D(GL_TEXTURE_3D, 0,GL_RGBA8UI, 16, 16,16,
0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,data);
//Example 4: an int 8 red channel texture
glTexImage3D(GL_TEXTURE_3D, 0,GL_R8UI, 16, 16,16,
0, GL_RED_INTEGER, GL_UNSIGNED_BYTE,data);
glBindTexture(GL_TEXTURE_3D, 0);
struct cudaGraphicsResource* tex_CUDA;
cudaError_t err = cudaGraphicsGLRegisterImage(
&tex_CUDA,
volumetexture,
GL_TEXTURE_3D,
cudaGraphicsMapFlagsNone);
printf("cudaGraphicsGLRegisterImage error [%d]:",err);
if ( err==cudaSuccess) printf( "cudaSuccess" );
if ( err==cudaErrorInvalidDevice) printf( "cudaErrorInvalidDevice" );
if ( err==cudaErrorInvalidValue) printf( "cudaErrorInvalidValue" );
if ( err==cudaErrorInvalidResourceHandle) printf( "cudaErrorInvalidResourceHandle" );
if ( err==cudaErrorUnknown) printf( "cudaErrorUnknown" );
printf("\n");