2016-01-22 42 views
0

我希望我的OpenCL程序的輸出直接在屏幕上繪製,而不需要從GPU下載然後再次上傳。我如何將數據放入內核的頂點數組中?我在C++中使用glfw3,並與nVidia的默認OpenCL庫一起使用。修改來自OpenCL內核的VBO數據

+1

http://enja.org/2010/08/27/adventures-in-opencl-part-2-particles-with-opengl/可能會有所幫助。我有一個可以運行的例子,我會盡量在後面找到。你基本上需要創建一個GL/CL共享上下文。之後,一切都很簡單。 – DarkZeros

+0

似乎就是這樣,我需要什麼。謝謝! – Addi

+0

@DarkZeros,我建議你把你的評論作爲答案,以便它可以被標記爲正確的。 – Dithermaster

回答

2

該示例可以幫助:http://enja.org/2010/08/27/adventures-in-opencl-part-2-particles-with-opengl/

關鍵要求是成立CL/GL共享的上下文。根據您的GL主機上,你需要不同的屬性設置爲CL背景:

蘋果:

cl_context_properties props[] = 
    { 
     CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)kCGLShareGroup, 
     0 
    }; 

的Windows:

cl_context_properties props[] = 
     { 
      CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), 
      CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), 
      CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 
      0 
     }; 

其他:

cl_context_properties props[] = 
     { 
      CL_GL_CONTEXT_KHR, (cl_context_properties)glXGetCurrentContext(), 
      CL_GLX_DISPLAY_KHR, (cl_context_properties)glXGetCurrentDisplay(), 
      CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 
      0 
     }; 

然後,您創建上下文並使用GL緩衝區(每次獲取並釋放它們):

context = cl::Context(CL_DEVICE_TYPE_GPU, props); 
cl::BufferGL glbuffer(context, CL_MEM_READ_WRITE, myvbo, &err); 

for (each frame){ 
    queue.enqueueAcquireGLObjects(&glbuffer); 
    //use glbuffer as if it is a clbuffer 
    queue.enqueueReleaseGLObjects(&glbuffer); 
} 
+0

wglGetCurrentDisplay()和wglGetCurrentContext()定義在哪裏? – Addi

+0

它們是「glx.h」的一部分。不過你也可以使用'glGetCurrentContext()'。 – DarkZeros

+0

原來,我需要「wglew.h」:-)! – Addi