Ursina引擎中如何使用自发光贴图实现3D模型发光效果
Ursina实体同时应用基础纹理+自发光纹理实现发光效果
问题原因
你尝试将两张纹理打包为元组传入texture参数的写法无法生效,是因为Ursina实体的texture字段仅接受单张纹理资源作为漫反射/基础色输入,没有内置自动识别元组第二资源为自发光贴图的逻辑。自发光效果需要给实体单独赋值自发光纹理属性,同时配合支持光照计算的着色器才能正常渲染。
正确实现步骤
- 正常加载模型与基础纹理:基础纹理依旧通过
texture参数传入即可,无需改动原有基础纹理加载逻辑 - 指定支持自发光的着色器:Ursina默认的无光照着色器不会读取自发光纹理参数,需要切换到内置的带光照着色器
lit_with_shadows_shader,该着色器已内置自发光纹理采样计算逻辑 - 单独赋值自发光纹理与相关参数:通过实体的
emissive_texture属性加载自发光贴图,同时调整自发光颜色、强度参数避免效果被遮罩
可直接参考的实现代码
from ursina import * app = Ursina() # 替换为你自己的模型、纹理文件路径 game_model = Entity( model='your_model_path.obj', texture='base_texture.png', # 基础纹理正常赋值 scale=1, shader=lit_with_shadows_shader, # 启用支持自发光的光照着色器 # 如果自发光纹理带透明通道,加上下面这行 # transparent=True ) # 单独加载并赋值自发光纹理 game_model.emissive_texture = load_texture('emissive_texture.png') # 设置自发光颜色,设为白色时会显示自发光贴图原色,需要偏色可修改为对应色值 game_model.emissive_color = color.white # 可选:调整自发光强度,数值越高发光效果越亮,默认值为1 game_model.emissive_scale = 1.2 # 测试用场景组件,正式项目可按需删除 DirectionalLight(y=2, z=-3).look_at(game_model) EditorCamera() app.run()
常见不生效问题排查
- 检查纹理路径正确性:如果文件路径错误,Ursina控制台会输出红色加载警告,不会静默加载成功
- 确认着色器选择:不要使用默认无光照着色器、或不带自发光计算逻辑的自定义着色器,否则
emissive_texture参数不会被读取 - 检查
emissive_color值:如果该参数设为全黑(默认初始值),自发光强度会被计算为0,即使贴了自发光纹理也看不到效果 - 透明通道问题:如果自发光纹理带透明区域,需要将实体的
transparent属性设为True,避免透明区域渲染错乱
内容的提问来源于stack exchange,提问作者Psychon Night
相关产品推荐
相关产品推荐

