我正在尝试从OpenCL内核填充OpenCL-OpenGL共享缓冲区。我写了一个简单的程序来绘制3点。 3个顶点的(x,y,z)值填充在内核中。但这些点并未按预期绘制。我知道我没有正确访问共享缓冲区。代码如下:
cl_GLuint vbo;
struct vertex
{
float x, y, z, w; // position
}pos[3];
void CreateVBO(){
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,3*sizeof(vertex),pos,GL_DYNAMIC_DRAW);
}
void Display(void)
{
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPointSize(10.0);
CreateVBO();
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(4, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS,0,3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);
glutSwapBuffers();
}
void InitGL(int argc , char * argv[])
{
glutInit(&argc , argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Draw Points");
glewInit();
glutDisplayFunc(Display);
glClearColor(0,0,0,1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glEnable( GL_POINT_SMOOTH | GL_DEPTH_TEST );
}
//MAIN program
global_item_size = local_item_size = 1
InitGL(argc,argv);
//set properties
cl_context_properties properties[] =
{
CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(),
CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(),
CL_CONTEXT_PLATFORM, (cl_context_properties)platforms[i],
0
};
/* Create OpenCL context */
context = clCreateContext(properties, 1, device_id, NULL, NULL, &ret);
/* Create Command Queue */
cmd_queue = clCreateCommandQueue(context, device_id[0], 0, &ret);
/* Create Kernel Program from the source */
program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);
/* Build Kernel Program */
ret = clBuildProgram(program, 1, device_id, NULL, NULL, NULL);
/* Create OpenCL Kernel */
kernel = clCreateKernel(program, "drawPoints", &ret);
/* create opencl buffer*/
vbo_cl = clCreateFromGLBuffer(context,CL_MEM_READ_WRITE,vbo,NULL);
/* Set OpenCL Kernel Parameters */
ret = clSetKernelArg(kernel, 0,sizeof(cl_mem), (void *)&vbo_cl); //,
glFlush();
ret = clEnqueueAcquireGLObjects(cmd_queue, 1, &vbo_cl, 0,0,0);
/* Execute OpenCL Kernel */
ret = clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL,&global_item_size, &local_item_size, 0, NULL, &event);
ret = clEnqueueReleaseGLObjects(cmd_queue, 1, &vbo_cl, 0,0,0);
clFinish(cmd_queue);
Display();
glutMainLoop();
//KERNEL CODE (Nvidia 820M Geforce GPU )
__kernel void drawPoints(__global float4* buffer)
{
buffer[0] = (float4)(0, 1, -1, 1.0f);
buffer[1] = (float4)(-1, -1, -1, 1.0f);
buffer[2] = (float4)(1, -1, -1, 1.0f);
}
我使用的是NVIDIA Geforce 820M GPU。目前内核只填充缓冲区。我尝试初始化pos[3]
函数中的CreateVBO()
值,然后尝试在内核中更新它。在这两种情况下,程序都会执行而没有任何错误。在坐标(0,0,0)处绘制点,这不是预期结果。请告诉我从OpenCL内核修改/更新OpenGL缓冲区数据的正确方法。
答案 0 :(得分:0)
确定。我发现了这个问题。我在CreateVBO();
内呼叫DisplayGL()
。 CreateVBO()
初始化缓冲区,因此设置为(0,0,0)。