我们如何显示像素数据计算在一个OpenCL内核到屏幕使用OpenGL?



我对用c++编写实时光线跟踪应用程序很感兴趣,我听说使用OpenCL-OpenGL互操作性是一种很好的方法(以充分利用GPU),所以我已经开始使用这种互操作性编写c++项目,并使用GLFW进行窗口管理。我应该提到,虽然我有一些编码经验,但我在c++方面没有那么多经验,并且在尝试这个项目之前没有使用过OpenCL或OpenGL,所以如果给出的答案考虑到这一点(也就是说,首选初学者友好的术语),我会很感激。

到目前为止,我已经能够获得OpenCL-OpenGL互操作性工作与使用顶点缓冲对象的例子。我还演示了我可以用RGBA数组创建图像数据(至少在CPU上),使用glTexImage2D()将其发送到OpenGL纹理,并使用glBlitFramebuffer()显示它。

我的问题是,我不知道如何创建一个能够计算像素数据的OpenCL内核,这样它就可以作为glTexImage2D()中的数据参数。我明白,要使用互操作性,我们必须首先创建OpenGL对象,然后创建OpenCL对象,从这些对象上写入数据,因为这些对象共享内存,所以我假设我必须首先创建一个空的OpenGL数组对象,然后创建一个OpenCL数组对象,从中应用一个适当的内核,在使用OpenGL数组对象作为glTexImage2D()中的数据参数之前写入像素数据。但我不确定该使用哪种对象,也没有看到任何例子来证明这一点。一个简单的例子,展示OpenCL如何为OpenGL纹理图像创建像素数据(假设一个有效的OpenGL -OpenGL上下文)将非常感激。请不要遗漏任何一行,因为我可能无法填写空格!

我上面描述的实现光线追踪器的方法也很有可能是不可能的,或者至少不推荐,所以如果是这种情况,请概述一个建议的替代方法,将OpenCL内核计算的像素数据发送到OpenGL,然后将其绘制到屏幕上。对我来说,这个类似问题的答案没有进入足够的细节,而且CL/GL互操作链接不起作用。答案提到,这可以实现使用renderbuffer而不是纹理,但它说在底部的Khronos OpenGL wiki的renderbuffer对象,发送像素数据的唯一方法是通过像素传输操作,但我找不到任何直接的解释如何初始化数据这种方式。

请注意,我使用的是OpenCL c(没有c++绑定)。

从你的第二段,你正在创建一个OpenCL上下文与GLX_DISPLAY/WGL_HDC和GL_CONTEXT属性的平台特定组合与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位,您可能还需要更改像素对齐方式。

最新更新