javascript - 使用 WebGL API 进行数学运算

标签 javascript browser webgl

标题说明了一切,但我的问题是,是否可以在浏览器(例如 Google Chrome)中使用 WebGL API 来解决一些数学问题?

假设我想使用 WebGL API 将两个数字相乘,这通常可行吗?如果可行,我该怎么做?

请原谅我没有分享任何代码,因为我没有想出任何答案。

最佳答案

只是将 2 个数字相乘并不是您想要在 WebGL 中做的事情。将 2 个数字相乘需要 50-70 次设置调用。

如果您想将 200 万个数字乘以 200 万个其他数字,那么这更适合 WebGL。有很多使用 GPU 进行数学运算的示例。首先,GPU 所做的只是数学运算。恰好人们要求它做的最常见的数学运算是渲染 3D 或 2D 图形。

您需要搜索的词是GPGPU .

弄清楚如何调整您的解决方案以适应 how GPUs work 是一门艺术。 .

WebGL从纹理中读取数据并将数据写入纹理的基本点。什么是纹理?它们实际上只是值的二维数组。因此,您将数据放入那些二维数组(纹理)中,然后使用 WebGL 从这些二维数组(纹理)中读取数据并将数据写入其他二维数组(纹理)。

与普通计算的最大区别是

  1. 至少在 WebGL 1 中,从纹理读取数据的每个方向都由 0.0 到 1.0 的值寻址。要从二维数组(纹理)中获取特定值,您必须计算其归一化坐标值(纹理坐标)。

    假设 xy 是一个 ivec2 表示二维数组中的 2 个整数索引,我们可以计算从二维数组(纹理)中获取值所需的归一化坐标

    vec2 uv = (vec2(xy) + 0.5) / textureDimensions;
    vec4 value = texture2D(2dArrayOfValuesTexture, uv);
    

    在 WebGL 2 中,我们不必这样做。我们可以做到

    vec4 value = textureFetch(2dArrayOfValuesTexture, xy, 0);
    
  2. 您没有随机的写作权限

    一般来说,WebGL 按顺序写入目标二维数组(纹理),这可能会妨碍您的操作。有时有creative , workarounds .

  3. 您无法立即访问以前的结果。

    一般来说,如果您要计算 10000 个答案,您可以随时引用以前的答案。换句话说,当您计算答案 3766 时,您可以引用答案 0 到 3765。

    但在 WebGL 中,在计算完所有答案之前,您无法访问之前的任何答案。当然,一旦你计算了所有这些,你就可以将这些答案传回另一个计算。这基本上是在一个巨大的“批量计算”过程中,答案不能相互引用。

正如 Kirill 指出的那样,也存在一些限制。 WebGL 1.0 具有浮点纹理,因此很容易获取数据。获取数据需要更多的工作,将答案编码为 8 位 4 channel 纹理,读取结果,然后将它们解码回答案,但有很多人这样做。 WebGL 2 将消除执行该编码/解码步骤的需要。

关于javascript - 使用 WebGL API 进行数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684892/

相关文章:

javascript - 谷歌云端硬盘 API : Force login popup to login again or to logon as another user

javascript - css/javascript 表单 onfocus 占位符文本仍然存在,在键入时消失

javascript - .net API : trailing zeroes are truncated

html - 浏览器在 <table> 标签之前呈现的 Phantom <br> 标签

javascript - 在 javascript 和 WebGL 中创建纹理并在 WebAssembly 中识别它们

android - 为 Android WebView 启用 WebGL 支持

javascript - 如何在 CSS 中组合变换?

html - 有没有办法告诉浏览器不要提示用户记住特定页面上的密码?

Android Web 浏览器主页

animation - Three.js 在 100 立方体动画上崩溃