Three.js 中不受雾影响的自定义着色器
Custom shader not affected by fog in Three.js
我有一个球体,我通过自定义着色器向其添加光晕。
我的场景有雾,它影响球体,但不影响发光(当我缩小时,球体消失,但发光仍然存在)。
如何让雾影响发光?
这是一个包含整个场景的代码笔:
http://codepen.io/marjan-georgiev/pen/WrmPLY?editors=0010
这是我的辉光material代码
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 );
}
`
});
}
看看 r70 的雾片段(您正在使用)HERE,您会看到它正在将雾应用到 gl_FragColor。
将 fog_fragment 移动到设置 gl_FragColor 之后应该会使雾对着色器产生影响。
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" ]}
}
',
我有一个球体,我通过自定义着色器向其添加光晕。
我的场景有雾,它影响球体,但不影响发光(当我缩小时,球体消失,但发光仍然存在)。
如何让雾影响发光?
这是一个包含整个场景的代码笔:
http://codepen.io/marjan-georgiev/pen/WrmPLY?editors=0010
这是我的辉光material代码
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 );
}
`
});
}
看看 r70 的雾片段(您正在使用)HERE,您会看到它正在将雾应用到 gl_FragColor。
将 fog_fragment 移动到设置 gl_FragColor 之后应该会使雾对着色器产生影响。
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" ]}
}
',