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

