【发布时间】:2019-08-17 18:51:08
【问题描述】:
我想在OpenCL 中进行一些自定义渲染。我需要的一件事是深度缓冲区。我已经搜索了很多,但是由于编译器优化,许多解决方案不再起作用。
这是绘制点的基本内核。如果两个点在同一个位置,我只想将一个靠近相机。
__kernel void render_points(__global const uint4 *points, __global float *zbuffer, __global uint *img)
{
int i = get_global_id(0);
uint4 point = points[i];
int pos = point.y * WIDTH + point.x;
if (point.z < zbuffer[pos]) {
zbuffer[pos] = point.z;
img[pos] = point.w;
}
}
但是这种简单的方法不起作用,因为由于并行性和缓冲回写,zbuffer 不会立即为所有线程更新。
我正在使用 OpenCL 1.2,包括 32 位原子扩展。
问题
如何实现深度缓冲区?
【问题讨论】:
-
您可以使用任何并行排序算法,例如剪切排序,使用距离作为键和点作为数据对它们进行排序。但这需要几次内核启动。如果点的数量很少,您可以简单地循环所有点并通过比较全部与全部来找到它们的排名,并将它们的数据写入排名作为缓冲区的索引。
-
我知道,我可以通过排序摆脱深度缓冲区。我仍然对深度缓冲区实现感兴趣,因为它更灵活。
标签: opencl