textures - WebGL 如何用于通用计算(GPGPU)?

标签 textures webgl rgb gpgpu

我听说您可以通过生成纹理和使用 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/

相关文章:

javascript - Canvas 屏幕截图不起作用

java - 提高 JavaFX WebGL 性能

c++ - FFMPEG:在 h264rgb/libx264rgb 错误中解码视频

javascript - 如何在 Three.js 中使 emissiveMap 仅在黑暗区域照明?

unity3d - 2D Sprite 的mipmap的目的?

javascript - 我无法通过应用复杂的着色器来查看网格

objective-c - 如何计算RGB颜色中颜色分量的 "amount"

wolfram-mathematica - Mathematica RGB转灰度的详细计算

java - 使用 LWJGL 和 VBO 的简单纹理不起作用

ios - 如何从 ARKit 应用程序更改对象的纹理?