2016-01-22 2 views
0

Я хочу, чтобы выход моей программы OpenCL рисовался непосредственно на экране, без загрузки с графического процессора, а затем снова загружался. Как я могу поместить данные в мой массив вершин из ядра? Я использую glfw3 и glew вместе с библиотекой OpenCL по умолчанию nVidia в C++.Измените данные VBO из ядра OpenCL

+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:

Apple:

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() ans wglGetCurrentContext() определен? – Addi

+0

Они являются частью «glx.h». Однако вы также можете использовать 'glGetCurrentContext()'. – DarkZeros

+0

Оказывается, мне нужно «wglew.h» :-)! – Addi

Смежные вопросы