Cuda opengl interop 和 cudaGraphicsGLRegisterImage 导致错误

Posted

技术标签:

【中文标题】Cuda opengl interop 和 cudaGraphicsGLRegisterImage 导致错误【英文标题】:Cuda opengl interop and cudaGraphicsGLRegisterImage causes error 【发布时间】:2013-07-13 04:02:45 【问题描述】:

我正在尝试与在我的 K20 上运行的 cuda 和在我的 quadro 上运行的 opengl 进行一些跨卡通信,但我似乎无法注册我想与 cuda 一起使用的纹理。

我的代码看起来像这样

glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0);

checkGLError();  // Passes 


// This will cause an Access Violation when run from visual studio 10 debugger 
cudaGraphicsGLRegisterImage(&texRes, texId, GL_TEXTURE_2D,cudaGraphicsRegisterFlagsNone);

// If ran with out debugger, cudaGetErrorString() will spit out "invalid argument"
checkCudaError();

cudaGraphicsGLRegisterImage 从 Visual Studio 10 调试器运行时会导致访问冲突

但是……

如果在没有调试器的情况下运行,cudaGetErrorString() 将输出“无效参数”

我不确定问题可能是什么,并且由于不同的错误消息而变得更加混乱。

【问题讨论】:

你看过CUDA SDK自带的OpenGL互操作演示吗 是的,但我找不到使用的 cudaGraphicsGLRegisterImage。 我认为gaussian blur demo使用这种方法来映射OpenGL纹理 我去看看 【参考方案1】:

好吧,我似乎已经弄清楚出了什么问题,我换了行...

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 

到...

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, textureSize, textureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

我不确定为什么 cuda 对 GL_RGBA 有问题,但似乎确实如此。

【讨论】:

以上是关于Cuda opengl interop 和 cudaGraphicsGLRegisterImage 导致错误的主要内容,如果未能解决你的问题,请参考以下文章

cuda 究竟为 opengl 应用程序做了啥?

为啥 OpenGL 和 CUDA 上下文内存贪婪?

Cuda Cudnn安装

Cuda Cudnn安装

OpenGL与CUDA互操作方式总结

OpenGL与CUDA互操作方式总结