【问题标题】:How to use custom shaders in an Angular app?如何在 Angular 应用程序中使用自定义着色器?
【发布时间】:2019-03-11 10:46:10
【问题描述】:

我有一个 Angular 6 应用程序,我正在尝试从 threejs.org 示例中使用一些自定义着色器。问题是您需要将带有一些着色器设置的脚本标签放入您的 html 页面中,如下所示:

    <script type="x-shader/x-vertex" id="vertexshader">
        uniform float amplitude;
        attribute vec3 customColor;
        attribute vec3 displacement;
        varying vec3 vNormal;
        varying vec3 vColor;
        void main() {
            // ... some code
        }
    </script>

    <script type="x-shader/x-fragment" id="fragmentshader">
        varying vec3 vNormal;
        varying vec3 vColor;
        void main() {
            // ... some code
        }
    </script>

...然后在创建 THREE.ShaderMaterial 之后,使用此材质创建一些网格,但 angular 会从其组件的 html 中删除脚本标签,因此我无法使用这种标准方法。应该如何在角度组件中创建和使用顶点和片段着色器?将应用任何建议和示例!

【问题讨论】:

    标签: three.js angular6


    【解决方案1】:

    尝试使用 HTTP 客户端将着色器作为文本获取:

    适用于 Angular 6-8:

    http.get('assets/shaders/particle.vert', {
      responseType: 'text'
    }).subscribe(data => {
      vertexS1 = data;
    })
    

    【讨论】:

      【解决方案2】:

      问题是您需要将带有一些着色器设置的脚本标签放入您的 html 页面,如下所示:

      这根本不是一件事,它只是您可能在各种示例中找到的一种(不良)模式。

      您可以编写着色器并以多种方式使用它们。

      让我们首先确定着色器只不过是一个字符串

      所以如果你这样做:

      const myShader = 'dolphins shooting lazers out of their eyes'
      
      const myMaterial = new THREE.ShaderMaterial({vertexShader: myShader})
      

      Three.js 不会抱怨(直到你开始渲染并且 WebGL 真正抱怨),你给着色器材质一个有效的输入类型,只是内容是无效的 GLSL。

      你可以只做多行字符串:

      const shader = `
        uniform vec3 foo;
        varying vec3 bar;
        void main(){...}
      `
      

      或者您可以获取文件本身:

      new THREE.FileLoader().load('my_shader.vert',(file)=>{
         myShader = file
         //make new THREE.ShaderMaterial() here
      })
      

      或者,如果您有什么要解释的 requireimport

      import myShader from './shaders/my_shader.vert'
      const myShader = require('./shaders/my_shader.vert')
      

      这将允许您编写着色器并在 .vert | .frag | .vs | .fs | .glsl 文件中突出显示,并且可以异步获取它,或者在构建时内联它。

      【讨论】:

      • 让它多行就可以了...但是,有没有更好的方法,比如创建一些 GLSL 文件,然后在组件中从中获取数据?
      • 是的。但这取决于您的环境如何使用它。您可以使用THREE.FileLoader(我认为存在)之类的东西来加载assets/shaders/my_shader.vert。另一种方法是使用require('./my_shader.vert')import myShader from './my_shader.vert' 并使用构建工具将其作为字符串内联。
      猜你喜欢
      • 2012-05-17
      • 2018-08-10
      • 2014-08-07
      • 2011-06-20
      • 1970-01-01
      • 2021-11-21
      • 2021-12-11
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多