将cuFFT应用于OpenGL顶点缓冲区对象

时间:2016-02-13 20:50:19

标签: opengl cuda glsl cufft

因此cufftComplex类型是一个数组,n结构带有xy - 字段,分别代表每个复数的实部和虚部。

另一方面,如果我想在OpenGL中创建一个顶点缓冲区对象,其中包含x-y-字段,即2D顶点或仅表示{{1}的顶点缓冲区对象复数,我必须创建一个n大小的浮点数组,其布局如下:

2n

然后我通过调用

将其写入VBO
x0 y0 | x1 y1 | ... | xn yn

我想用cuFFT对图像进行傅里叶变换,并显示例如复数值的大小。如何解决这两种数据类型之间的不兼容问题?有没有办法让cuFFT对VBO起作用?

修改

也许我应该编写一个采用cufftComplex类型的CUDA内核,并将每个复数的大小映射到1D-VBO。或者是将cufftComplex类型映射到2D-VBO的CUDA内核。我不知道会有什么开销,因为它是设备 - >设备我希望它是可管理的。

1 个答案:

答案 0 :(得分:0)

我设法通过编写内核来解决这个问题,如下所示:

__global__ void cufftComplex2Float(float* vbo_magnitude, Complex *z, const int width, const int height){
    unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
    unsigned int j = blockIdx.y*blockDim.y + threadIdx.y;
    float magnitude = pow(z[j*height + i].x, (float)2) + pow(z[j*height + i].y, (float)2);
    vbo_magnitude[j*height + i] = (PI2 + atanf(sqrt(0.1*magnitude))) / PI;
};

它不涉及主机设备传输,所以它非常快。