私は現在、多くのビデオ処理を行うプロジェクトを開発しています。このプロジェクトでは、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 でやろうとしているのは私が初めてだとは信じられません。たぶん、重要なドキュメントの主要な章を見逃しただけかもしれません:-)。