我想弄清楚是否有办法让以下OpenCL方法仅适用于OpenGL。这个OpenCL内核做的是通过主机生成的几个缓冲区并复制到设备内存,以了解要渲染到OpenGL纹理srgb
的图形。 CPU为每个帧生成那些缓冲区以进行渲染,将这些缓冲区的复制排入GPU,并将以下内核的执行排入队列,该内核在OpenCL临时拥有时写入OpenGL纹理,然后自然地将其全部归属于OpenGL。完成OpenGL在屏幕上显示纹理。这个OpenCL内核的迭代完全集中在一次完全生成和写入单个像素,它非常基于每个像素和纹理的每个像素以相同的方式操作,相同的参数和数据工作用。
kernel void draw_queue_srgb_kernel(global float *paramlist, global int *poslist, global int *entrylist, global uchar *data_cl, write_only image2d_t srgb, const int sector_w, const int sector_size)
{
const int2 p = (int2) (get_global_id(0), get_global_id(1));
float4 pv; // pixel value (linear)
// this computes the pixel value
pv = draw_queue(paramlist, poslist, entrylist, data_cl, sector_w, sector_size);
// this writes the pixel value to the texture
write_imagef(srgb, p, linear_to_srgb(pv));
}
将类似方法仅用于OpenGL的最佳方法是什么?我需要灵活地以任何方式提供不是纹理的数组(它们更类似于用于绘制的索引和参数列表)并且为每个像素做很多数学运算(我使用sqrt()
,{ {1}},sin()
和exp()
例如很多),另一方面,纹理的每个像素都以相同的方式处理一次,而我正在写平常的OpenGL纹理8位/通道RGB(A)格式,所以没什么特别的。
如果你想知道我为什么要抛弃OpenCL它有两个原因,图形驱动程序往往会以浪费CPU的方式处理运行内核并定期暂停(如60 FPS)(使用尽可能多的CPU)对于相同的负载,无论你是以400 FPS运行还是由于驱动程序线程中的浪费轮询而将其减慢到25,但更重要的是因为我使用emscripten进行JavaScript构建,因为WebCL支持几乎不存在不可预见的是,最好严格遵守WebGL。看起来似乎也许我想用OpenGL做得更好。