【问题标题】:Issue with threejs and shaders showing an sphere glowThreejs和着色器显示球体发光的问题
【发布时间】:2015-05-29 08:44:41
【问题描述】:

我正在研究 3D 可视化。我需要展示一个有气氛的世界,我的例子是threejs r40,但我的是r71。

当我尝试添加大气(一种代表世界的球体发光)时,我收到以下错误:

three.min.js:445 Uncaught TypeError: c.addEventListener is not a function

我的代码如下:

scene.add(createAtmosphere());

function createAtmosphere() {

    shader = Shaders['atmosphere'];
    uniforms = THREE.UniformsUtils.clone(shader.uniforms);
    mesh = new THREE.Mesh(new THREE.Sphere(200, 40, 30), 
        new THREE.ShaderMaterial({

          uniforms: uniforms,
          vertexShader: shader.vertexShader,
          fragmentShader: shader.fragmentShader

        })
      );

    mesh.scale.x = mesh.scale.y = mesh.scale.z = 1.1;
    mesh.flipSided = true;
    mesh.matrixAutoUpdate = false;
    mesh.updateMatrix();
    return mesh;
  }

这是着色器

var Shaders = {
    'atmosphere' : {
      uniforms: {},
      vertexShader: [
        'varying vec3 vNormal;',
        'void main() {',
          'vNormal = normalize( normalMatrix * normal );',
          'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
        '}'
      ].join('\n'),
      fragmentShader: [
        'varying vec3 vNormal;',
        'void main() {',
          'float intensity = pow( 0.8 - dot( vNormal, vec3( 0, 0, 1.0 ) ), 12.0 );',
          'gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 ) * intensity;',
        '}'
      ].join('\n')
    }
  };

我解决了另一个着色器问题,但我找不到这个问题的问题(我不熟悉着色器,这让我发疯)。

提前致谢

【问题讨论】:

    标签: three.js shader


    【解决方案1】:

    你必须创建你的网格发送SphereGeometry,而不是Sphere

    http://threejs.org/docs/#Reference/Objects/Mesh http://threejs.org/docs/#Reference/Extras.Geometries/SphereGeometry

    scene.add(createAtmosphere());
    
    function createAtmosphere() {
    
        shader = Shaders['atmosphere'];
        uniforms = THREE.UniformsUtils.clone(shader.uniforms);
        mesh = new THREE.Mesh(new THREE.SphereGeometry(200, 40, 30), 
            new THREE.ShaderMaterial({
    
              uniforms: uniforms,
              vertexShader: shader.vertexShader,
              fragmentShader: shader.fragmentShader
    
            })
          );
    
        mesh.scale.x = mesh.scale.y = mesh.scale.z = 1.1;
        mesh.flipSided = true;
        mesh.matrixAutoUpdate = false;
        mesh.updateMatrix();
        return mesh;
      }
    

    【讨论】:

    • 是的,你是对的,事实上我在展示地球时改变了这一点(昨天漫长的一天)。无论如何,使用 SphereGeometry 不会显示任何内容 (gist.github.com/glena/0b2875044cd6c39ff150)。我应该回到D3并坚持2D哈哈哈
    • @GermánLena 你还得到你提到的错误吗?如果不是,则可能是您的着色器有问题。尝试首先使用普通材质创建网格,然后查看它是否显示。您可能还想将此问题标记为已回答并创建一个新问题,因为这是一个不同的问题。
    • 你说得对,我在这里发了一个新问题,你有什么线索吗? stackoverflow.com/questions/30538512/…
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多