我正在使用AMD的OpenCL 1.1实现编写GPU光线行进器(我正在使用其c++包装器api)。最初,我使用网格单元和dsm的大型单维数组以及自己的插值函数来实现内核,效果很好。附带说明一下,我正在使用单独的内核进行dsm采样。
现在,我正在重新实现我的代码,以利用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(上下文,标志,格式,宽度,高度,深度,0、0,host_ptr和&err);
上下文是我的OpenCL上下文
标志= 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是指向原始网格的指针
&err是指向错误对象的指针
我启用了cl_khr_3d_image_writes,我还在内核中声明了我的dsm:
__write_only image3d_t dsm。
本质上,我运行我的DSM示例内核,然后运行我的ray march内核。我对image3d数据的两个内核参数使用相同的指针。
我想不出我可以包括的任何其他细节。
最佳答案
CL_MEM_READ_ONLY
意味着您只打算从缓冲区读取。因此,不允许写操作。如果要从缓冲区读取和写入,请使用CL_MEM_READ_WRITE
。