Применение cuFFT к объектам буфера вершин OpenGL
Итак 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. Или CUDA-ядро, которое отображает тип cufftComplex на 2D-VBO. Я не знаю, каковы будут издержки, так как это устройство -> устройство, я ожидаю, что оно будет управляемым.
1 ответ
Мне удалось решить эту проблему, написав ядро следующим образом:
__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;
};
Он не требует передачи на хост-устройство, поэтому он довольно быстрый.