Применение 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;
};

Он не требует передачи на хост-устройство, поэтому он довольно быстрый.

Другие вопросы по тегам