[求助]使用3D纹理时遇到问题,想了2天没想通...
函数源码如下:
应用场景:我从文件中读入一个512*512*4的3D数据,是unsigned short格式的,要将其绑定到3D纹理上。然后在kernel中用tex3D访问。代码完全参考的是SDK中的simpleTexture3D和volumeRender的,只是数据的三维不再相等。
遇到问题:绑定过程中没有错误提示,到了kernel执行中(即使如上面的一个什么都不做的kernel),也会在输出中出现如下的错误提示:Texture3D.exe 中的 0x7c812afb 处最可能的异常: Microsoft C++ 异常: 内存位置 0x0012fa08 处的 cudaError。
求各位高手指点一下问题所在,非常感谢!
texture <unsigned short, 3, cudaReadModeElementType> tex;
cudaArray *d_volumeArray = NULL;
//随便写个空的kernel
__global__ void kernel()
{
unsigned int tid = threadIdx.x;
}
void initTex(unsigned short *pPrj, cudaExtent extent)
{
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<unsigned short>();
cutilSafeCall( cudaMalloc3DArray(&d_volumeArray, &channelDesc, extent) );
// copy data to 3D array
cudaMemcpy3DParms copyParams = {0};
copyParams.srcPtr = make_cudaPitchedPtr((void*)pPrj, extent.width*sizeof(unsigned short), extent.width, extent.height);
copyParams.dstArray = d_volumeArray;
copyParams.extent = extent;
copyParams.kind = cudaMemcpyHostToDevice;
cutilSafeCall( cudaMemcpy3D(©Params) );
// set texture parameters
tex.normalized = false; // access with normalized texture coordinates
tex.filterMode = cudaFilterModeLinear; // linear interpolation
tex.addressMode[0] = cudaAddressModeClamp; // wrap texture coordinates
tex.addressMode[1] = cudaAddressModeClamp;
tex.addressMode[2] = cudaAddressModeClamp;
// bind array to 3D texture
cutilSafeCall(cudaBindTextureToArray(tex, d_volumeArray, channelDesc));
//随便执行一个空的kernel就在输出中看到cudaError内存错误
kernel<<<100, 256>>>();
}
//main中调用部分
int main()
{
//....
//载入数据
cudaExtent extent;
extent.width = 512;
extent.height = 512;
extent.depth = 4;
int volumeSize = extent.width * extent.height * extent.depth;
unsigned short *pPrj = (unsigned short*)malloc( sizeof(unsigned short) * volumeSize);
//从文件中读入数据岛pPrj中....
initTex(pPrj, extent);//使用cudaGetLastError或者是cudaThreadSynchronize都没能捕捉到错误
}
应用场景:我从文件中读入一个512*512*4的3D数据,是unsigned short格式的,要将其绑定到3D纹理上。然后在kernel中用tex3D访问。代码完全参考的是SDK中的simpleTexture3D和volumeRender的,只是数据的三维不再相等。
遇到问题:绑定过程中没有错误提示,到了kernel执行中(即使如上面的一个什么都不做的kernel),也会在输出中出现如下的错误提示:Texture3D.exe 中的 0x7c812afb 处最可能的异常: Microsoft C++ 异常: 内存位置 0x0012fa08 处的 cudaError。
求各位高手指点一下问题所在,非常感谢!
...全文
相关推荐
简单的D3D9纹理共享
创建共享纹理:在创建纹理时,可以设置`D3DCREATE_SHARED`标志。这将创建一个可以由其他设备访问的共享纹理。2.
opengl3D纹理映射旋转代码和详细注解
在进行3D纹理映射旋转时,我们通常会利用矩阵变换来实现。
D3D11纹理基础
Direct3D 11是微软开发的图形API,用于创建高性能的3D图形应用程序。在Direct3D 11中,纹理是渲染场景时不可或缺的一部分,它们为模型提供了颜色、光照和其他视觉效果。
Android移动开发-使用OpenGL来绘制3D纹理图的实现
该项目基于Android平台,利用OpenGL ES技术实现3D纹理图像的渲染。通过Gradle构建系统组织项目结构,并引入appcompat等支持库确保界面兼容性。核心功能集中在原生图形接口调用,完
D3D11教程四之纹理映射源码
参数包括纹理的宽度、高度、格式、MIP级别等。MIP映射是一种优化技术,通过预计算不同分辨率的纹理层,使得在不同距离观察时能提供平滑的过渡效果。2.


