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

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")生成的图片不再偏暗

效果对比

  • 预期效果:MergedImg预期效果
  • 实际生成偏暗效果:实际生成的偏暗效果

可行解决方案

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:15:34