将 cuFFT 应用于 OpenGL 顶点缓冲区对象
Applying cuFFT to OpenGL Vertex Buffer Objects
所以 cufftComplex
类型是一个数组,其中包含 n
结构,其中包含一个 x
和一个 y
字段,分别代表每个的实部和虚部复数。
另一方面,如果我想在 OpenGL 中创建一个带有 x-
和 y-
字段的顶点缓冲对象,即一个 2D 顶点或只是一个也表示 n
复数,我必须创建一个 2n
大小的浮点数组,布局如下:
x0 y0 | x1 y1 | ... | xn yn
然后我通过调用将其写入 VBO:
glBufferData(GL_ARRAY_BUFFER, n * sizeof(GLfloat), complex_values_array, GL_DYNAMIC_DRAW);
我想用 cuFFT 对图像进行傅里叶变换,并显示例如复数值的大小。如何解决这两种数据类型之间的这种不兼容问题? cuFFT 是否可以对 VBO 采取行动?
编辑:
也许我应该编写一个 CUDA 内核,它采用 cufftComplex 类型并将每个复数的大小映射到 1D-VBO。或者将 cufftComplex 类型映射到 2D-VBO 的 CUDA 内核。我不知道开销是多少,因为它是 device-> device 我希望它是可管理的。
我通过如下编写内核设法解决了这个问题:
__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;
};
它不涉及主机-设备传输,因此非常快。
所以 cufftComplex
类型是一个数组,其中包含 n
结构,其中包含一个 x
和一个 y
字段,分别代表每个的实部和虚部复数。
另一方面,如果我想在 OpenGL 中创建一个带有 x-
和 y-
字段的顶点缓冲对象,即一个 2D 顶点或只是一个也表示 n
复数,我必须创建一个 2n
大小的浮点数组,布局如下:
x0 y0 | x1 y1 | ... | xn yn
然后我通过调用将其写入 VBO:
glBufferData(GL_ARRAY_BUFFER, n * sizeof(GLfloat), complex_values_array, GL_DYNAMIC_DRAW);
我想用 cuFFT 对图像进行傅里叶变换,并显示例如复数值的大小。如何解决这两种数据类型之间的这种不兼容问题? cuFFT 是否可以对 VBO 采取行动?
编辑:
也许我应该编写一个 CUDA 内核,它采用 cufftComplex 类型并将每个复数的大小映射到 1D-VBO。或者将 cufftComplex 类型映射到 2D-VBO 的 CUDA 内核。我不知道开销是多少,因为它是 device-> device 我希望它是可管理的。
我通过如下编写内核设法解决了这个问题:
__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;
};
它不涉及主机-设备传输,因此非常快。