仅将OpenCL内核改编为OpenGL

仅将OpenCL内核改编为OpenGL,opengl,webgl,opencl,shader,Opengl,Webgl,Opencl,Shader,我想知道是否有一种方法可以将下面的OpenCL方法仅适用于OpenGL。这个OpenCL内核所做的是通过主机生成的几个缓冲区并复制到设备内存,以了解要渲染到OpenGL纹理的图形srgb。CPU为每个要渲染的帧生成这些缓冲区,将这些缓冲区复制到GPU并将以下内核的执行排队,该内核在OpenGL暂时拥有OpenGL纹理时写入OpenGL纹理,然后在完成所有操作后,OpenGL自然会在屏幕上显示纹理。这个OpenCL内核的迭代完全集中于在一次过程中完全生成和写入单个像素,它以每像素为基础,以相同的方

我想知道是否有一种方法可以将下面的OpenCL方法仅适用于OpenGL。这个OpenCL内核所做的是通过主机生成的几个缓冲区并复制到设备内存,以了解要渲染到OpenGL纹理的图形
srgb
。CPU为每个要渲染的帧生成这些缓冲区,将这些缓冲区复制到GPU并将以下内核的执行排队,该内核在OpenGL暂时拥有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()
sin()
exp()
erf()
很多),另一方面,纹理的每个像素都会以相同的方式处理一次,我正在以通常的8位/通道RGB(A)格式写入OpenGL纹理,所以没有什么特别的


如果您想知道我为什么要放弃OpenCL,有两个原因,图形驱动程序倾向于以浪费CPU的方式处理以固定间隔(如60 FPS)暂停运行的内核(无论您以400 FPS的速度运行还是由于驱动程序线程中的浪费轮询而将其降低到25 FPS,在相同的负载下使用同样多的CPU),但更重要的是,因为我使用emscripten构建JavaScript,而且由于WebCL支持几乎不存在,而且不可预见,因此最好严格遵守WebGL。似乎我想用OpenGL做的更好。

图形驱动程序倾向于以固定的间隔(比如60 FPS)处理运行中的内核。
这不是驱动程序的问题吗?我运行了一个内核30秒,它在计算它的时候被卡住了,就像一个非常适合我的片段着色器一样。或者您可以将其几乎1:1转换为计算着色器。WebGL还不支持计算着色器。