【发布时间】:2019-11-06 01:02:01
【问题描述】:
我正在研究光线追踪器。我想通过使用 GPU 将每个像素的数据保存在 OpenCV Mat 中来优化我的代码。
现在,我将像素值保存在缓冲区 fb 中,这是一个由三个值 (RGB) 组成的向量:
__global__ void render(vec3 *fb, int max_x, int max_y, Camera **cam, Triangle *data, size_t n, )
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
int j = threadIdx.y + blockIdx.y * blockDim.y;
if ((i >= max_x) || (j >= max_y)) return;
int pixel_index = j * max_x + i;
float u = float(i) / float(max_x);
float v = float(j) / float(max_y);
Ray r = (*cam)->get_ray(u,v);
fb[pixel_index] = color(r, data,n);
}
然后我将数据保存在 CPU 上的 Mat 中:
for (int j = ny - 1; j >= 0; j--)
{
for (int i = 0; i < nx; i++)
{
size_t pixel_index = j * nx + i;
int ir = int(255.99*fb[pixel_index].r());
int ig = int(255.99*fb[pixel_index].g());
int ib = int(255.99*fb[pixel_index].b());
output.at<Vec3b>(j, i)[0] = (uchar)ib;
output.at<Vec3b>(j, i)[1] = (uchar)ig;
output.at<Vec3b>(j, i)[2] = (uchar)ir;
//std::cout << ir << " " << ig << " " << ib << "\n";
}
}
但是当我有一个大像素阵列时,这是一个非常缓慢的过程。这就是为什么我想使用 OpenCV GpuMat 并将数据直接保存在 GPU 上的原因。
问题是我真的找不到如何在 GPU Mat 的每个通道中保存数据的示例。这是一种简单的方法吗,类似于在 CPU 上保存数据?
【问题讨论】:
-
GpuMat只是一个设备缓冲区的包装器,使在 opencv 中的工作更容易。您可以让其构造函数使用其默认分配器创建一个,或者您可以将设备指针作为*data参数与维度/步幅/类型信息一起传递给已分配的缓冲区(如果使用流或多个GPU,强烈推荐)。您还可以使用ogl::命名空间或通过标准 CUDA 方法与 OpenGL 进行互操作。例如,您可以通过将其缓冲区指针传递给内核来直接填充它。也许您应该详细说明您希望如何使用它?