You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何设置物体自发光,使其亮度不受环境光变化影响?

实现不受环境光影响的恒定自发光

要解决低光环境下物体亮度变暗的问题,核心是让自发光效果完全独立于环境光、漫反射等光照参数——也就是让物体自身发出的光直接叠加到最终颜色上,而不是和其他光照项耦合计算。下面分两种场景给出具体方案:

一、自定义Shader实现(适合需要精细控制的情况)

你当前的光照计算应该是将环境光、漫反射、高光叠加后乘以物体基础色,这种逻辑下环境光变弱时整体亮度必然下降。我们需要添加一个独立的自发光项,直接加到最终结果中:

  1. 首先在你的参数中新增自发光相关变量:
private float ambient = 0.3f;
private float diffuse = 1.0f;
private float specular = 1.0f;
private float specularPower = 6.0f;
// 新增自发光参数
private Color emissiveColor = Color.white; // 自发光颜色
private float emissiveIntensity = 1.0f;   // 自发光强度
  1. 修改光照计算逻辑,让自发光直接叠加到最终颜色:
// 以片段着色器为例(不同引擎/框架语法略有差异)
fixed4 CalculateFinalColor() {
    // 计算常规光照项
    fixed ambientTerm = ambient;
    fixed diffuseTerm = diffuse * max(0, dot(normalDir, lightDir));
    fixed specularTerm = specular * pow(max(0, dot(viewDir, reflect(-lightDir, normalDir))), specularPower);
    
    // 采样物体基础颜色(比如纹理)
    fixed4 baseColor = tex2D(mainTex, uvCoords);
    
    // 计算独立的自发光项:不受任何环境光照影响
    fixed4 emissiveTerm = emissiveColor * emissiveIntensity;
    
    // 最终颜色 = 基础色 * 常规光照 + 自发光(自发光直接叠加)
    fixed4 finalColor = baseColor * (ambientTerm + diffuseTerm + specularTerm) + emissiveTerm;
    
    return finalColor;
}

这里的关键是自发光项不参与任何和环境光相关的乘法运算,直接加到最终结果里,这样不管环境光多暗,自发光的亮度都能保持恒定。

二、使用引擎内置Shader(以Unity为例,快速实现)

如果用的是Unity,不需要自己写Shader,直接利用Standard Shader的Emission功能就能搞定:

  • 选中你的材质,在Inspector面板中切换到Standard Shader;
  • 展开「Emission」板块,勾选「Emission」复选框;
  • 设置合适的自发光颜色和强度(颜色越亮、强度越高,发光效果越明显);
  • 确认后,物体就会持续发出恒定亮度的光,完全不受环境光强弱的影响。

注意事项

  • 如果自发光强度设置过高,可能会导致颜色过曝,建议从低强度开始慢慢调整;
  • 如果你需要让物体完全不受其他光照影响(只显示自发光),可以把ambient、diffuse、specular的参数都设为0,只保留自发光项即可。

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

火山引擎 最新活动