使用OpenGL时是否可以在GPU上执行浮点运算?

时间:2010-10-19 21:24:48

标签: opengl gpu

在大学,我们已经介绍了OpenGL,这是我第一次使用它。到目前为止,我已经实现了像Sierpinski carpet之类的简单操作,我注意到大多数(固定和浮点)计算都是在CPU上执行的。 OpenGL是否提供了一些API,可以将这些计算“转发”到GPU?

我知道,有OpenCL或CUDA这样的框架,但我想知道OpenGL是否可以使用GPU进行典型的图形计算,比如计算坐标。

3 个答案:

答案 0 :(得分:10)

  

OpenGL是否提供了一些API   可以“转发”这些计算   GPU?

我会看一下GLSL,OpenGL着色语言。

尽管@Jared说过,我认为你可以编程GPU来并行计算Sierpinski地毯,至少可以达到规定的迭代次数。 (在WebGL中尝试这将是一个有趣的项目。)

编辑这是使用WebGL的Sierpinski地毯的GPU实现,它基于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-enabled browser,然后将上述代码粘贴到“来源”窗口中。按Alt + Enter:Presto!在我的笔记本电脑上,它没有很好的震动,但有一个图形加速卡,它运行速度为45-60 fps。

要获取屏幕截图中显示的背景纹理,我在输入下使用此纹理作为单元0:http://www.iquilezles.org/apps/shadertoy/presets/tex3.jpg

如您所见,我将lim(迭代级别数)设置为5 ...在我测试的分辨率下,接近子像素精度。

Serpinski carpet

所以你的问题的答案,“我想知道OpenGL是否可以使用GPU进行典型的图形计算,比如计算坐标,”肯定是的。从技术上讲,上面使用像素着色器,它计算颜色以生产Sierpinski地毯。如果您确实需要调整顶点的坐标,则可以使用顶点着色器。这个过程很相似。

答案 1 :(得分:1)

如果你按照像素执行此操作,则必须将总线上的坐标发送到GPU,计算新坐标,然后将其发回,然后调用OpenGL命令绘制点等等。

使用着色器,您可能可以使用Sierpinski地毯,但分形是非常顺序的(至少是通过点后平均点计算的典型方式)。换句话说,您将失去使GPU具有吸引力的并行优势。

答案 2 :(得分:0)

正如其他人所说,你需要使用着色器。除了GLSL,您还可以使用Cg。