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