我听说您可以通过生成纹理和使用 RGB 值(或类似的东西来运行计算)来使用 WebGL 进行通用计算 (GPGPU)。这怎么可能,有人可以提供一个简单的代码示例吗?
具体来说,我知道您可以使用图像并将它们映射到带有纹理的表面,但我不知道如何在 WebGL 着色器中创建任意的 RGB 值纹理。另外,一旦你生成了一个纹理,你会以什么方式使用 RGB 值来实际进行计算?最后,一旦执行了计算,您如何将结果传回 JavaScript 以便以有意义的方式使用它们?
谢谢你。
最佳答案
WebGL (OpenGL) 允许您创建着色器程序,该程序允许您在 GPU 上运行您自己的应用程序代码。通常,这用于计算要显示的位置和颜色。为此,您提供 GPU 数据,并使用提供给 GPU 的数据运行您自己的代码。可以想象,传递任意数据和运行任意指令的能力=一般计算的可能性(在限制范围内)。
您也不一定要直接渲染到屏幕(后台缓冲区),而是要渲染到您选择的纹理。但其中一个限制(基本规范)是您只能为每个像素输出 4*8 位的 RGBA 值。您如何计算这个 32 位 RGBA 以及如何解释它完全取决于您。
例如,也许您想运行许多 sqrt 计算。首先你创建一个纹理,纹理上的每个“像素”都是你的初始值(浮点数打包到 RGBA 中);然后在 GPU 上,您指示它对每个像素进行 sqrt 计算并输出结果;结果是屏幕颜色的垃圾,但是如果您编写一个将 RGBA 转换回浮点数的解包函数,那么您就有了基于 GPU 的 sqrt 计算器!
此外,纹理只不过是以某种格式打包的一组值。例如,尝试 canvas.getContext("2d").getImageData(0,0,10,10)
。 WebGL 中的等价物是 gl.readPixels()
。
然而,我没有可运行的示例,WebGL api 非常冗长,需要大量重复才能完成一些简单的事情。
关于textures - WebGL 如何用于通用计算(GPGPU)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34540391/