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
相关产品推荐
相关产品推荐

