【发布时间】:2019-08-06 17:00:14
【问题描述】:
我创建了一个 OpenGL 元素缓冲区来绘制一组三角形。 当我尝试在 OpenCL 内核中使用此缓冲区时,数组中的值会发生偏移。
示例: 原始数组中的前两个三角形 [1, 2, 3] [1, 3, 4] 从 OpenCL 内核读取时 [1, 2, 3] [3, 4, 0]
似乎 OpenCL 以与 OpenGL 不同的元素大小/步幅读取缓冲区。但是为什么呢?
缓冲区的OpenGL定义:
glm::uvec3 triangles;
...
GLuint gl_buffer_id = 0;
glGenBuffers(1, &gl_buffer_id);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl_buffer_id);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(glm::uvec3) * triangles.size(), triangles.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
将 GL 缓冲区传递给内核
cl_int err;
cl_mem cl_buffer = clCreateFromGLBuffer(cl_context, CL_MEM_READ_ONLY, gl_buffer_id, &err);
...
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&cl_buffer);
OpenCL 内核
__kernel void my_kernel(
__global uchar4 * points_color,
__global uint3 * triangles
)
{
int pid = get_global_id(0);
points_color[pid] = (uchar4)(triangles[1].x, triangles[1].y, triangles[1].z, 255); // use vertex id as color component
}
【问题讨论】: