2011-06-03 82 views
1

我正在使用AMD的OpenCL 1.1实现(我正在使用他们的C++ wrapper API)编写GPU ray marcher。最初,我使用大型单维数组来实现内核,用于沿着我自己的插值函数对其进行加密的体积和dsm,这些函数运行良好。作为一个方面说明,我正在使用一个单独的内核进行dsm采样。AMD OpenCL 1.1 image3d_t在内核编写

现在我正在重新实现我的代码,以便利用OpenCL类型image3d,它具有自己的硬件加速插值函数,用于卷和dsm。我的音量image3d工作正常,但是我无法在ray march内核中获得dsm image3d的工作。

正如我前面提到的,我正在使用单独的内核来对dsm进行采样。从我读的文档(以及显卡设备规格)中,我应该可以直接写入我的内核中的image3d:

write_imagef(image3d_t image,int4 coord,float4 value);

其中image是dsm,coord是网格的x,y,z值(因为我在3维中运行dsm内核,它由全局id定义),value是该位置的值。我正在初始化我的dsm image3d在我的代码中使用: cl :: Image3D(context,flags,format,width,height,depth,0,0,host_ptr,& err);

其中上下文是我的OpenCL小节 flags = CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR 宽度,高度和深度是dsm网格的宽度,高度和深度 格式是具有以下设置的cl :: ImageFormat: format.image_channel_order = CL_RGBA; format.image_channel_data_type = CL_FLOAT; 接下来的两个位置都没有用,所以它们被设置为0 host_ptr是一个指向原始网格 和&犯错是指向一个错误对象

我启用cl_khr_3d_image_writes,我也说过我是帝斯曼在内核为: __write_only image3d_t dsm。

本质上,我运行我的DSM示例内核,然后运行我的ray march内核。我为image3d数据的两个内核参数使用了相同的指针。

我想不出任何其他细节,我可以包括。

回答

1

CL_MEM_READ_ONLY表示您只打算从缓冲区读取数据。因此不允许写入。如果要读取和写入缓冲区,请使用CL_MEM_READ_WRITE