在大学,我们已经介绍了OpenGL,这是我第一次使用它.到目前为止,我已经实现了像Sierpinski地毯这样简单的东西,我注意到大多数(固定和浮点)计算都是在CPU上执行的.OpenGL是否提供了一些API,可以将这些计算"转发"到GPU?
我知道,有OpenCL或CUDA这样的框架,但我想知道OpenGL是否可以使用GPU进行典型的图形计算,比如计算坐标.
Lar*_*rsH 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);
}
Run Code Online (Sandbox Code Playgroud)
要测试这个,请使用支持WebGL的浏览器转到Shader Toy,然后将上面的代码粘贴到"Source"窗口中.按Alt + Enter:Presto!在我的笔记本电脑上,它没有很好的震动,但有一个图形加速卡,它运行在45-60帧/秒.
为了获得屏幕截图中显示的背景纹理,我在输入下使用了这个单元0的纹理:http://www.iquilezles.org/apps/shadertoy/presets/tex3.jpg
正如您所看到的,我将lim(迭代级别数)设置为5 ...在我测试的分辨率下,接近子像素精度.
所以你的问题的答案,"我想知道OpenGL是否可以使用GPU进行典型的图形计算,比如计算坐标,"肯定是的.从技术上讲,上面使用像素着色器,它计算颜色以生产Sierpinski地毯.如果您确实需要调整顶点的坐标,则可以使用顶点着色器.这个过程很相似.
归档时间: |
|
查看次数: |
1818 次 |
最近记录: |