如何为Threejs着色器组装合适的制服?

时间:2017-10-06 18:49:56

标签: javascript three.js webgl shader

我正在试图弄清楚如何正确使用Three.js'内置ShaderChunk用于照明和雾等等,我认为第一步就是复制其中一个ShaderLib着色器'建立。所以从我开始使用:

customMaterial = new ShaderMaterial({
    lights: true,
    uniforms: UniformsUtils.merge( [
      UniformsLib.common,
      UniformsLib.specularmap,
      UniformsLib.envmap,
      UniformsLib.aomap,
      UniformsLib.lightmap,
      UniformsLib.emissivemap,
      UniformsLib.fog,
      UniformsLib.lights,
      {
        emissive: { value: new Color( 0x000000 ) },
        diffuse: { value: new Color( 1,1,1 ) }
      }
    ]),
    vertexShader: document.getElementById("vertexShader").textContent,
    fragmentShader: document.getElementById("fragmentShader").textContent
  })

着色器代码只是直接从meshlambert_vert.glslmeshlambert_frag.glsl复制,而该部分基于this entry in the ShaderLib

然而,我正在同时从两个不同的相机/渲染器渲染我的测试场景,我立刻发现了一个问题。对于已应用此customMaterial的对象,更改一个摄像机的透视图会更改第二个摄像机的照明角度。

我认为这是因为其他地方引用了这些UniformLib个对象?

我不确定我应该在这里传递什么,也不知道为什么这不起作用,但标准材料确实如此。我想我跳过了一步,但我不明白它会是什么。

这是一个codepen,我尽可能地解决了这个问题。现在它几乎是ShaderLib来源的直接副本。在这一点上,我认为这是一个传递参考,它应该是WebGLRenderer内的某个副本。 https://codepen.io/cl4ws0n/pen/dVewdZ

无论它的价值如何,我还尝试添加第二个场景,并在它们之间移动对象。这并没有解决它,也没有在单独的场景中共享材料的单独对象。 preview of the codepen link

2 个答案:

答案 0 :(得分:1)

WebGLRenderer对某些材料有一些硬编码逻辑。在这种情况下,它正在寻找一个名为isMeshLambertMaterial的标志:https://github.com/mrdoob/three.js/blob/r87/src/renderers/WebGLRenderer.js#L1780

因此,请尝试在材料中设置#include <stdio.h> #include <conio.h> #include <string.h> #include <math.h> int main() { char a[26]; a[0]='a'; a[1]='b'; a[2]='c'; a[3]='d'; a[4]='e'; a[5]='f'; a[6]='g'; a[7]='h'; a[8]='i'; a[9]='j'; a[10]='k'; a[11]='l'; a[12]='m'; a[13]='n'; a[14]='o'; a[15]='p'; a[16]='q'; a[17]='r'; a[18]='s'; a[19]='t'; a[20]='u'; a[21]='v'; a[22]='w'; a[23]='x'; a[24]='y'; a[25]='z'; char b[10]; b[0]='0'; b[1]='1'; b[2]='2'; b[3]='3'; b[4]='4'; b[5]='5'; b[6]='6'; b[7]='7'; b[8]='8'; b[9]='9'; printf("Enter the character of your choice-"); char c[1]; scanf("%c",&c); int i =0; for(i=0;i<26;i++) { if (c==a[i]) printf("The character is an alphabet"); } int j; for(j=0;j<10;j++) { if (c==b[j]) printf("The character is an number"); } return 0; }

答案 1 :(得分:0)

正如Matjaz Drolc所说,这是三个r87中的一个错误。 needsUpdate ShaderMaterials标记无法正常运行select min(p.start_timestamp AT TIME ZONE p.timezone AT TIME ZONE 'America/Phoenix') as Date, 'America/Phoenix' AS Timezone, sum(GREATEST(0, p.value)) as Value, p.uom as UnitOfMeasurement from main.production_ts_2017_10 p where p.start_timestamp AT TIME ZONE p.timezone >= to_date('2017-09-30','YYYY-MM-DD') + INTERVAL '2 day' and p.start_timestamp AT TIME ZONE p.timezone <= '2017-10-30' and p.serial_number = '5T7842974Z' group by date_trunc('hour', p.start_timestamp AT TIME ZONE p.timezone AT TIME ZONE 'America/Phoenix'), p.uom order by Date 。您可以在我的codepen链接中的每个渲染过程之前强制更新,它将正确呈现。请参阅前叉https://codepen.io/cl4ws0n/pen/qPYwzp

我在回购中遇到了问题,如果有人想跟踪它的进展,可以找到here