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

Unity中设置Color的Alpha值无效,像素无法透明的问题

问题解决:Unity中给图像染红色并保留细节

问题描述

设置new Color的Alpha值时,尝试过0、150、255均无效,像素显示为不透明的红色;想要实现类似灰度图的染色效果,给像素染上红色同时保留原图像细节,而非直接填充红色。

原代码

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class ReadPixelsFromImage : MonoBehaviour
{
    public Texture2D tx2d;
    public RawImage ri;

    void Start()
    {
        ReadPixelsFromT2D(tx2d);
        ri.texture = tx2d;
    }

    void Update()
    {

    }

    private void ReadPixelsFromT2D(Texture2D Texture)
    {
        Color[] colors = Texture.GetPixels();
        
        for (int i = 0; i < colors.Length; i++)
        {
            if (i > 20000 && i < 100000)
            {
                colors[i] = new Color(255,0,0,0);
            }
        }

        Texture.SetPixels(colors);
        Texture.Apply();
    }
}

当前效果

当前效果:红色不透明填充,未保留原图细节


问题根源与解决方案

1. 核心问题

  • Color参数范围错误:Unity的Color构造函数接收的是**01的浮点数**,而非0255的整数。传入255会被自动 clamp 到1,导致红色完全饱和;若纹理格式不支持透明(如RGB24),Alpha值设置也会无效。
  • 直接覆盖像素:colors[i] = new Color(...)是直接替换原像素颜色,自然丢失原图细节,需要用颜色混合逻辑实现染色效果。

2. 前置准备

确保你的Texture2D支持透明通道:

  • 导入图片后,在Inspector面板设置Texture Format为RGBA32
  • 勾选Read/Write Enabled选项

3. 修改后的代码(两种方案)

private void ReadPixelsFromT2D(Texture2D Texture)
{
    Color[] colors = Texture.GetPixels();
    
    for (int i = 0; i < colors.Length; i++)
    {
        if (i > 20000 && i < 100000)
        {
            // 方案1:保留原像素亮度,生成红色调灰度效果
            float brightness = colors[i].grayscale; // 获取原像素的亮度值
            // 用亮度值作为红色通道,绿蓝设为0,保留原Alpha
            colors[i] = new Color(brightness, 0, 0, colors[i].a);

            // 方案2:混合原颜色与红色,可调整红色深浅(注释掉方案1后启用)
            // Color targetRed = new Color(1, 0, 0, colors[i].a);
            // colors[i] = Color.Lerp(colors[i], targetRed, 0.6f); // 0.6为混合比例,0~1之间调整
        }
    }

    Texture.SetPixels(colors);
    Texture.Apply();
}

方案说明

  • 方案1:完全复刻灰度图的逻辑,将原像素的亮度映射到红色通道,绿蓝通道置0,既保留原图明暗细节,又呈现纯红色调。
  • 方案2:通过Color.Lerp线性混合原颜色与目标红色,调整第三个参数可控制红色的深浅程度,0为原图颜色,1为纯红色,兼顾细节与染色效果。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:10:33