【问题标题】:Loading Shaders in WebGL as of 2018? [duplicate]截至 2018 年在 WebGL 中加载着色器? [复制]
【发布时间】:2019-01-24 10:40:29
【问题描述】:

我记得我们必须像这样将着色器嵌入到 html 中:

<script id="fragmentShader" type="x-shader/x-vertex"> </script>
<script id="vertexShader" type="x-shader/x-vertex"></script>

对我来说这并不理想。当然,我可以创建着色器文件并使用 PHP 来包含它们,但我也不想要。

在没有第三方工具的情况下,有没有其他方法可以在 HTML 中使用着色器?

【问题讨论】:

  • 只是好奇 - 你有什么理由不想使用“第三方工具”吗?我唯一想到的“没有第三方工具”就是将它们作为字符串嵌入到 JS 中。
  • 很好奇 PHP 如何适应这一切。

标签: javascript three.js webgl webgl2


【解决方案1】:

着色器代码必须以某种方式可用于 WebGL 代码,所以这里没有魔法。一些替代方案是:

  • 使用 Ajax 检索着色器的源代码。在这种情况下,您的 HTML 将没有着色器,而 Javascript 代码将通过异步调用来检索它们。这种方法的缺点是您可能有很多请求,并且可能会影响页面加载时间。
  • 将 Javascript 代码中的着色器源硬编码为字符串文字。这将很难维护,因为您会将 Javascript 代码与着色器代码混合在同一个文件中。它可能适用于小型项目,但从长远来看会带来麻烦。
  • 使用 WebAssembly 并将您的代码(包括着色器源)编译为 wasm 文件。在这种情况下,着色器源将隐藏在 wasm 文件中,并由浏览器直接处理。
  • 使用工具包创建分发包。您可以将着色器和 Javascript 代码分开并组织起来(例如,放入目录等)。然后,您可以使用像 Gulp 或 Grunt 这样的 Javascript 工具包来处理代码并将它们合并到一个源文件中。您可以查看source code of Three.js 并了解它是如何组织的。如果您想使用该库,您所要做的就是将一个文件导入您的 HTML 页面。该文件包含 Javascript 和相关着色器。

【讨论】:

  • WASM 方法似乎是我的最佳选择。你知道有什么好的编译器可以将着色语言编译成 wasm 吗?
  • 看看 Emscripten kripken.github.io/emscripten-site -- 但我应该记住,着色器仍然是 wasm 文件中的 ASCII 字符,所以如果想法是隐藏着色器,这将不是非常有效。 GPU 是唯一真正编译着色器的部分,但这只发生在您在浏览器中运行 WebGL 代码时。如果你想对好奇的人隐藏你的代码,那么你应该寻找一个 obfuscator 工具。
  • 你真的要从
  • 这个答案太过分了,在 JS 上下文中,着色器只是一个字符串,仅此而已。你如何获得它与 webgl、webgl2 或三个都没有关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2020-01-06
  • 2014-09-06
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多