Можно ли выполнять операции с плавающей запятой на GPU при использовании OpenGL? - PullRequest
2 голосов
/ 20 октября 2010

В университете у нас есть введение в OpenGL, и я впервые работаю с ним. До сих пор я реализовал простую вещь, такую ​​как Sierpinski carpet , и заметил, что большинство вычислений (как с фиксированной, так и с плавающей точкой) выполняются на CPU. Предоставляет ли OpenGL некоторый API, который может «пересылать» эти вычисления в GPU?

Я знаю, что существуют фреймворки, такие как OpenCL или CUDA, но мне интересно, может ли OpenGL использовать GPU для типичных графических вычислений, таких как вычисление координат.

Ответы [ 3 ]

10 голосов
/ 20 октября 2010

Предоставляет ли OpenGL некоторый API, который может "переслать" эти расчеты GPU?

Я бы посмотрел на GLSL , Язык затенения OpenGL.

Несмотря на то, что сказал @Jared, я думаю, вы могли бы запрограммировать графический процессор для параллельного вычисления ковра Серпинского, по крайней мере, до определенного числа итераций. (Это был бы забавный проект, чтобы попробовать в WebGL.)

Редактировать: Вот реализация GPU ковра Серпинского с использованием WebGL, который основан на OpenGL ES 2.0 и использует GLSL для программирования шейдеров. Реализация OpenGL была бы очень похожа, если не идентична.

#ifdef GL_ES
precision highp float;
#endif

uniform vec2 resolution;
uniform float time;
uniform sampler2D tex0;

// Sierpinski carpet
void main(void)
{
    ivec2 sectors;
    vec2 coordOrig = gl_FragCoord.xy / resolution.xy;
    const int lim = 5;

    /* If you want it to spin, just to prove that it is redrawing
    the carpet every frame: */
    vec2 center = vec2(0.5, 0.5);
    mat2 rotation = mat2(
        vec2( cos(time), sin(time)),
        vec2(-sin(time), cos(time))
    );
    vec2 coordRot = rotation * (coordOrig - center) + center;
    vec2 coordIter = coordRot;

    for (int i=0; i < lim; i++) {
        sectors = ivec2(floor(coordIter.xy * 3.0));
        if (sectors.x == 1 && sectors.y == 1 ||
            // rotation can put us out of bounds
            sectors.x < 0 || sectors.x > 2 ||
            sectors.y < 0 || sectors.y > 2) {
            // make a hole
            gl_FragColor = vec4(texture2D(tex0, coordOrig).xyz, 1.0);

            return;
        } else {
            // map current sector to whole carpet
            coordIter.xy = coordIter.xy * 3.0 - vec2(sectors.xy);
        }
    }

    gl_FragColor = vec4(coordRot.x, 0.5, coordRot.y, 1.0);

}

Чтобы проверить это, перейдите к Shader Toy , используя браузер с поддержкой WebGL , и вставьте приведенный выше код в окно «Исходный код». Нажмите Alt + Enter: Presto! На моем ноутбуке, который не очень хорош, но имеет графическую ускоритель, он работает на скорости 45-60 кадров в секунду.

Чтобы получить текстуру фона, показанную на скриншоте, я использовал эту текстуру для блока 0 в разделе Входы: http://www.iquilezles.org/apps/shadertoy/presets/tex3.jpg

Как видите, я установил lim (число уровней итерации) равным 5 ... при разрешении, которое я тестировал, которое приближалось к точности до субпикселя.

Serpinski carpet

Так что ответ на ваш вопрос: «Интересно, может ли OpenGL использовать GPU для типичных графических вычислений, таких как вычисление координат», безусловно, да. Технически, вышеупомянутый использует пиксельный шейдер, который вычисляет цвет, чтобы произвести ковер Серпинского. Если вам действительно нужно настроить координаты вершин, вы бы использовали вершинный шейдер. Процесс похож.

1 голос
/ 20 октября 2010

Если вы сделали это для каждого пикселя, вам нужно было бы отправить координаты по шине в графический процессор, вычислить новую координату, затем отправить ее обратно, затем вызвать команды OpenGL для построения точки и т. Д.

С помощью шейдеров вы можете создавать ковер Серпинского, но этот фрактал очень последовательный (по крайней мере, типичный способ его вычисления с усреднением точек после точки).Другими словами, вы потеряете параллельное преимущество, которое делает GPU привлекательными.

0 голосов
/ 20 октября 2010

Как уже сказал другой, вам нужно использовать шейдер.Помимо GLSL, вы также можете использовать Cg.

...