You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整ThreeJS自定义shader中菲涅尔效应的衰减速率

ThreeJS 菲涅尔边缘收窄调整方案

你之前修改基础数值只能改变整体亮度,想要控制衰减速率需要对菲涅尔计算结果做幂次运算:幂值越高,菲涅尔衰减越快,效果就会越集中在模型边缘区域。

完整修改后代码

var material = THREE.extendMaterial(THREE.MeshStandardMaterial, {
  // Will be prepended to vertex and fragment code
  header: 'varying vec3 vNN; varying vec3 vEye;',
  // 新增菲涅尔强度系数uniform
  fragmentHeader: 'uniform vec3 fresnelColor; uniform float fresnelPower;',

  vertex: {
    '#include <fog_vertex>': `
      mat4 LM = modelMatrix;
      LM[2][3] = 0.0;
      LM[3][0] = 0.0;
      LM[3][1] = 0.0;
      LM[3][2] = 0.0;

      vec4 GN = LM * vec4(objectNormal.xyz, 1.0);
      vNN = normalize(GN.xyz);
      vEye = normalize(GN.xyz-cameraPosition);`
  },
  fragment: {
    'gl_FragColor = vec4( outgoingLight, diffuseColor.a );' : 
    // 对原有菲涅尔计算结果做幂运算,控制衰减速率
    `gl_FragColor.rgb +=  pow( ( 1.0 - -min(dot(vEye, normalize(vNN) ), 0.0) ), fresnelPower ) * fresnelColor;`
  },
  uniforms: {
    diffuse: new THREE.Color( 'black' ),
    fresnelColor: new THREE.Color( 'blue' ),
    // 可调整的幂值,数值越大边缘越窄
    fresnelPower: { value: 10 }
  }
});

参数调整说明

  • fresnelPower取值为2~4时:菲涅尔过渡柔和,向内延伸范围大
  • fresnelPower取值为8~16时:菲涅尔仅保留在窄边缘区域,符合仅边缘发光的需求
  • fresnelPower取值大于20时:会呈现极细的边缘线效果

内容的提问来源于stack exchange,提问作者Andrew Morris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:45:03