Godot中Shader处理暗图后,如何无需视口生成并保存图片?
解决Godot视口生成透明图片偏暗的循环问题
问题说明
- 使用视口生成透明图片时出现偏暗问题,对应Godot Issue #17574
- 已知添加以下Shader可修正显示效果:
shader_type canvas_item; render_mode blend_premul_alpha;
- 将视口生成的暗图导入TextureRect并应用上述Shader后显示正常,但现有带Shader的图片保存方法都依赖视口,而视口正是偏暗的根源,陷入循环
- 核心需求:让
viewport.get_texture().get_data().save_png("res://img.png")生成的图片不再偏暗
效果对比
- 预期效果:

- 实际生成偏暗效果:

可行解决方案
方案1:修改视口渲染设置
直接在视口的Rendering > Canvas > Default Blend Mode选项中,将值改为Premultiplied Alpha。这样视口渲染时会正确处理透明通道,生成的纹理无需额外处理即可正常保存。
方案2:代码修正像素数据
如果无法修改视口设置,可在保存前手动还原被alpha通道影响的RGB值:
var viewport_texture = viewport.get_texture() var target_image = viewport_texture.get_data() target_image.lock() for y in range(target_image.get_height()): for x in range(target_image.get_width()): var pixel_color = target_image.get_pixel(x, y) if pixel_color.a > 0.0: # 还原被alpha相乘的RGB通道值 pixel_color.r /= pixel_color.a pixel_color.g /= pixel_color.a pixel_color.b /= pixel_color.a target_image.set_pixel(x, y, pixel_color) target_image.unlock() target_image.save_png("res://img.png")
方案3:给视口内容直接加Shader
给视口内部的根节点添加你提到的预乘alpha Shader,让视口渲染时就应用正确的混合模式,直接保存视口纹理即可得到正常效果,无需后续额外处理。
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

