【问题标题】:Custom shader not affected by fog in Three.js自定义着色器不受 Three.js 中雾的影响
【发布时间】:2016-05-27 21:13:16
【问题描述】:

我有一个球体,我通过自定义着色器向其添加光晕。

我的场景中有雾,这会影响球体,但不会影响辉光(当我缩小球体时,球体消失,但辉光仍然存在)。

如何让雾影响发光?

这是一个包含整个场景的代码笔:

http://codepen.io/marjan-georgiev/pen/WrmPLY?editors=0010

这是我的发光材料代码

glowMaterial(){
  return new THREE.ShaderMaterial({
    side: THREE.BackSide,
    blending: THREE.AdditiveBlending,
    transparent: true,
    fog: true,

    uniforms: THREE.UniformsUtils.merge([
      THREE.UniformsLib[ "fog" ],
      {
        "c":   { type: "f", value: 0 },
        "p":   { type: "f", value: 4.5 },
        glowColor: { type: "c", value: Node.defaults.glowColor },
        viewVector: { type: "v3", value: {x: 0, y: 0, z: 400} },
        fog: true
      },
    ]),

    fragmentShader: `
      uniform vec3 glowColor;
      varying float intensity;
      ${THREE.ShaderChunk[ "common" ]}
      ${THREE.ShaderChunk[ "fog_pars_fragment" ]}
      void main()
      {
        vec3 outgoingLight = vec3( 0.0 );
        vec3 glow = glowColor * intensity;
        ${THREE.ShaderChunk[ "fog_fragment" ]}
        gl_FragColor = vec4(glow, 1.0 );
      }
    `,

    vertexShader: `
      uniform vec3 viewVector;
      uniform float c;
      uniform float p;
      varying float intensity;
      void main()
      {
        vec3 vNormal = normalize( normalMatrix * normal );
        vec3 vNormel = normalize( normalMatrix * viewVector );
        intensity = pow( c - dot(vNormal, vNormel), p );

        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
      }
    `
  });
}

【问题讨论】:

    标签: javascript 3d three.js webgl shader


    【解决方案1】:

    查看 r70(您正在使用的)HERE 的雾片段,您会看到它正在将雾应用于 gl_FragColor。
    在你设置 gl_FragColor 之后将fog_fragment 移动到应该会使雾对你的着色器产生影响。

    fragmentShader: '
      uniform vec3 glowColor;
      varying float intensity;
      ${THREE.ShaderChunk[ "common" ]}
      ${THREE.ShaderChunk[ "fog_pars_fragment" ]}
      void main()
      {
        vec3 outgoingLight = vec3( 0.0 );
        vec3 glow = glowColor * intensity;
        gl_FragColor = vec4(glow, 1.0 );
        ${THREE.ShaderChunk[ "fog_fragment" ]}
      }
    ',
    

    【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2012-10-12
    • 1970-01-01
    • 2019-07-29
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多