直接覆盖纹理 RGB 会丢失原图明暗细节。更合适的做法是先计算灰度,再用灰度调制目标颜色。
问题现象
之前介绍过 Cocos2d-x 图片灰度化。要把 Sprite 改为目标颜色,不能直接写入 0~255 的 RGB:
1 | // 比如颜色变红 |
GLSL 颜色分量通常使用 0.0~1.0。即便改成 vec4(1.0, 0.0, 0.0, alpha),直接覆盖 RGB 也会抹掉原纹理的明暗层次。
- 白色贴图看起来问题不明显:

- 原图带有颜色和明暗变化时,细节会明显丢失:

保留明暗细节的改色方法
1. 计算原图灰度
1 | vec4 textureColor = texture2D(CC_Texture0, v_texCoord); |
2. 用灰度调制目标颜色
1 | // 这里设置目标颜色为红色 |
这里保留了纹理 alpha,并乘上 v_fragmentColor,所以节点自身的颜色和透明度仍然生效。
最终效果:
