我正在学习 cuda 纹理记忆。现在,我得到了一个 opencv Iplimage,并得到了它的图像数据。然后我将纹理绑定到这个 uchar 数组,如下所示:
Iplimage *image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
unsigned char* imageDataArray = (unsigned char*)image->imagedata;
texture<unsigned char,2,cudaReadModeElementType> tex;
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(8, 8, 8, 0,
cudaChannelFormatKindUnsigned);
cudaArray *cuArray = NULL;
CudaSafeCall(cudaMallocArray(&cuArray,&channelDesc,width,height));
cudaMemcpy2DToArray(cuArray,0,0,imageDataArray,image->widthstep,
width * sizeof(unsigned char), height, cudaMemcpyHostToDevice);
cudaBindTextureToArray(texC1_cf,cuArray_currentFrame, channelDesc);
现在我启动内核,我想访问该图像的每个像素,每个通道。这就是我感到困惑的地方。
我使用此代码获取像素坐标(X,Y):
int X = (blockIdx.x*blockDim.x+threadIdx.x);
int Y = (blockIdx.y*blockDim.y+threadIdx.y);
我怎样才能访问这个(X,Y)的每个通道?下面的代码返回什么?
tex2D(tex, X, Y);
除此之外,你能告诉我纹理内存是如何使用纹理来访问数组的,以及这个变换是什么样子的吗?