我们如何使用OpenGL将OpenCL内核中计算的像素数据显示到屏幕上?

1hdlvixo  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(169)

我对用C编写实时光线跟踪应用程序很感兴趣,我听说使用OpenCL-OpenGL互操作性是一种很好的方法(为了很好地利用GPU),所以我已经开始使用这种互操作性编写一个C项目,并使用GLFW进行窗口管理,我应该提到,虽然我有一些编码经验,在尝试这个项目之前,我没有太多的c知识,也没有使用过OpenCL或OpenGL,所以如果回答时考虑到这一点,我将不胜感激(也就是说,最好使用初学者友好的术语)。
到目前为止,我已经能够通过一个使用顶点缓冲对象的示例实现OpenCL-OpenGL互操作性。我还演示了我可以使用RGBA数组创建图像数据(至少在CPU上),使用glTexImage 2D()将其发送到OpenGL纹理,并使用glBlitFramebuffer()显示它。
我的问题是,我不知道如何创建一个OpenCL内核,它能够计算像素数据,这样它就可以作为glTexImage 2D中的数据参数()。我知道要使用互操作性,我们必须首先创建OpenGL对象,然后从这些对象创建OpenCL对象,以便在这些对象共享内存时写入数据。所以我假设我必须首先创建一个空的OpenGL数组对象,然后从这个对象创建一个OpenCL数组对象,以应用一个适当的内核,在使用OpenGL数组对象作为glTexImage 2D中的数据参数之前,将像素数据写入该内核(),但我不确定要使用哪种对象,也没有看到任何演示这一点的示例。如果有一个简单的示例说明OpenCL如何为OpenGL纹理图像创建像素数据(假设有有效的OpenCL-OpenGL上下文),我会非常感激。请不要遗漏任何一行,因为我可能无法填充空白!
上面描述的用于实现光线跟踪器的方法也很可能是不可能的,或者至少是不推荐的,因此,如果是这种情况,请概述一个建议的替代方法,将OpenCL内核计算的像素数据发送到OpenGL,然后将其绘制到屏幕上。这个similar question的答案对我来说不够详细,CL/GL互操作链接不起作用。答案提到这可以通过使用渲染缓冲区而不是纹理来实现,但是在Khronos OpenGL wiki for Renderbuffer Objects的底部说,向它们发送像素数据的唯一方法是通过像素传输操作,但是我找不到任何关于如何以这种方式初始化数据的直接解释。
请注意,我使用的是OpenCL c(没有c
绑定)。

yzuktlbb

yzuktlbb1#

从第二帕拉开始,您将使用GLX_DISPLAY / WGL_HDC和GL_CONTEXT属性的平台特定组合创建OpenCL上下文,以便与OpenGL进行互操作,并且您可以创建一个顶点缓冲对象,该对象可根据需要由OpenGL和OpenCL进行读/写。
在OpenGL中,您可以将任何VBO复制到纹理中,

glBindBuffer(GL_PIXEL_UNPACK_BUFER, myVBO);
glTexSubImage2D(GL_TEXTURE_2D, level, x, y, width, height, format, size, NULL);

结尾处的NULL表示从GPU内存(解压缩缓冲区)而不是CPU内存复制。
与从常规CPU内存复制一样,如果不是32位,则可能还需要更改像素对齐方式。

相关问题