3D纹理对象

时间:2013-12-03 16:34:13

标签: cuda textures 3d-texture

目前我有一个使用以下纹理参考的内核(类型为unsigned char的3d纹理):

texture<unsigned char, 3, cudaReadModeElementType>  volumeTexture;

但是,我需要能够交换纹理的类型。我已经模仿了内核,因此它能够处理不同的类型。但是我在保持旧状态的同时无法交换纹理的类型或纹理本身(即能够同时处理unsigned charunsigned short)。

这就是我想到使用纹理对象API的原因。但是,此API似乎不支持3d纹理。可用的资源类型为LinearArrayMipMappedArrayPitch2D。它们似乎都不是为3D纹理设计的。纹理对象API是否真的不支持3d纹理?

有任何变通方法吗?我可以使用2d纹理,其中切片只是堆叠在彼此之上。但是,512³条目卷(= 512 * 512 = 262,144)的必要高度超过了最大texture2d高度(我的设备上为65,536)。因此,我必须将切片彼此相邻并且彼此叠加,这将导致相当脏的地址计算,我想避免。

另一种方法是复制内核代码并交换纹理引用。但那不是一个非常干净的解决方案。引用本身可以以某种方式模板化吗?

1 个答案:

答案 0 :(得分:1)

这个怎么样?

创建两个纹理参考:

texture<unsigned char, 3, cudaReadModeElementType>  volumeTexture_char;
texture<unsigned short, 3, cudaReadModeElementType>  volumeTexture_short;

然后,动态绑定到主机代码中所需的那个:

if (...) {
   cudaBindTexture(0, volumeTexture_char, ...);
}
else {
   cudaBindTexture(0, volumeTexture_short, ...);
}

然后,传入一个在kernel ::

中使用的标志
my_kernel<<...>>(use_short, ...);