我目前正在开发一个项目,我在其中进行大量视频处理。该项目使用 C++、openGL 和 glsl。最近我向它添加了一些 CUDA 例程,以进行一些更高级的图像处理工作。我设法在 cuda 中使用 openGL 纹理,但是现在我正在尝试使用带有 openGL 纹理作为输入的一些 cuda 的 npp 函数(没有成功)。
例如我想计算平均值和标准差。预处理输入openGL纹理的偏差:
//I first connect the cudaGraphicsResource to a cudaArray
//cudaGraphicsResource_t inputImage is input passed from openGL framework
cudaGraphicsMapResources(1,&inputImage);
cudaArray* inputImgArray = NULL;
cudaGraphicsSubResourceGetMappedArray(&inputArray, inputImage,0,0);
//Next I do some preparationwork and cast the cudaArray to a Npp8u* and give
//it as an input source imagebuffer to the npp routine.
NppiSize roi={imgwidth, imgheight};
int bufferSize = 0;
nppiMeanStdDev8uC1RGetBufferHostSize(roi,bufferSize);
double mean = 0;
double stdDev = 0;
Npp8u* scratch = nppsMalloc_8f(bufferSize);
int stepSize = imgWidth * sizeof(unsigned char);
NppStatus status = nppiMean_stdDev_8u_C1R((Npp8u*)inputImgArray, stepSize, roi, scratch,&mean,&stdDev);
//cleanup
nppsFree(bufferSize);
cudaGraphicsUnmapresources(1,&inputImage);
nppiMean_stdDev_8u_C1R 函数总是返回错误代码:NPP_MEMCPY_ERROR。我到处查看手册,但找不到这是否是使用 NPP 和 opengl 纹理的正确方法。我在互联网上也找不到任何东西。我不敢相信我是第一个试图用 NPP 做这些事情的人。也许我只是错过了一份重要文件中的一个重要章节:-)。