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

Godot C#通过代码修改材质后变为纯白无阴影问题求助

Godot 3D:代码修改StandardMaterial3D后材质变白无阴影的解决方案

在Godot中直接修改默认StandardMaterial3D或共享材质时,很容易遇到材质变白、无阴影的问题,核心原因是默认材质是全局共享资源,直接修改会打乱引擎的资源引用和渲染状态,而手动添加的材质是独立实例,不会触发这个问题。下面针对你尝试的三种代码方式给出修正方案:

1. 修正“直接访问网格材质”的代码

默认的网格材质是共享资源,不能直接修改,必须先复制出独立副本:

var orb = _orbResource.Instantiate<Orb>();
var originalMaterial = orb.Mesh.SurfaceGetMaterial(0);
if (originalMaterial is StandardMaterial3D material)
{
    // 复制材质副本,避免修改全局共享资源
    var materialCopy = material.Duplicate() as StandardMaterial3D;
    materialCopy.AlbedoColor = _color;
    orb.Mesh.SurfaceSetMaterial(0, materialCopy);
}

2. 修正“直接访问Override Material”的代码

同理,MaterialOverride如果是默认共享材质,必须复制后再修改:

var orb = _orbResource.Instantiate<Orb>();
if (orb.MaterialOverride is not StandardMaterial3D originalMaterial)
{
    throw new NullReferenceException("The orb did not have a material override");
}

// 复制材质副本,确保修改不会影响其他实例
var materialCopy = originalMaterial.Duplicate() as StandardMaterial3D;
materialCopy.AlbedoColor = _color;
        
orb.MaterialOverride = materialCopy;

3. 修正“新建Override Material”的代码

如果新建材质后修改属性失效,检查并调整如下:

var orb = _orbResource.Instantiate<Orb>();
var material = new StandardMaterial3D();
// 显式设置光照模式为着色模式,避免意外修改
material.ShadingMode = StandardMaterial3D.SHADED;
material.AlbedoColor = _color;
// 标记资源修改,触发引擎渲染更新
material.NotifyPropertyListChanged();
        
orb.MaterialOverride = material;

额外排查点

  • 验证_color变量的实际值,确保不是Color(1,1,1)(纯白)
  • 检查MeshInstance3D的ShadowCastingEnabled和ReceiveShadows属性是否为true(默认开启)
  • 确认场景中的点光源ShadowEnabled已开启,且光照范围覆盖目标球体

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:35