文章目录
- 前言
- 正文
- 为什么要有颜色混合?
- 颜色混合常见实现方式?
- 上述颜色混合注意点
- 结尾:喜欢的小伙伴点点关注+赞哦!
前言
本章节补充一下颜色混合的内容,主要包含:为什么要有颜色混合?颜色混合常实现方式?
正文
为什么要有颜色混合?
当需要渲染透明或半透明物体时,需要引入颜色混合,同时它也是颜色RGBA的alpha的体现!
颜色混合常见实现方式?
每个像素的颜色由RGBA构成,其中第四分量我们通常叫做alpha,也叫做透明度,一般取值范围 [ 0 , 1 ] [0,1] [0,1] 。
接下来举个最简单的颜色混合表达形式:
已知屏幕中
(
x
,
y
)
(x,y)
(x,y) 位置处的像素颜色RGB分量为
d
s
t
C
o
l
o
r
⃗
\vec {dstColor}
dstColor ,它的透明度为
d
s
t
A
l
p
h
a
dstAlpha
dstAlpha ,当我们需要在此位置渲染的像素颜色为
s
r
c
C
o
l
o
r
⃗
\vec {srcColor}
srcColor,透明度为
s
r
c
A
l
p
h
a
srcAlpha
srcAlpha ,则通过一下公式计算出最终颜色:
b
l
e
n
d
C
o
l
o
r
=
s
r
c
A
l
p
h
a
∗
s
r
c
C
o
l
o
r
⃗
+
(
1
−
s
r
c
A
l
p
h
a
)
∗
d
s
t
C
o
l
o
r
⃗
blendColor = srcAlpha * \vec {srcColor} + (1-srcAlpha) * \vec {dstColor}
blendColor=srcAlpha∗srcColor+(1−srcAlpha)∗dstColor
此时我们用待渲染像素颜色的alpha值直接表明颜色权重,我们简单举个例子:
当绘制不透明物体时, s r c A l p h a = 1 srcAlpha = 1 srcAlpha=1,此时原本屏幕的像素颜色就相当于被忽略了;
当绘制全透明物体时, s r c A l p h a = 0 srcAlpha = 0 srcAlpha=0,此时相当于没有画此像素;
当绘制透明物体时, s r c A l p h a = ( 0 , 1 ) srcAlpha = (0,1) srcAlpha=(0,1),此时相当于将底色和目标色进行线性插值,从而得到一种混合的效果;
当然了,这些公式都可以发散,例如写成如下:
b
l
e
n
d
C
o
l
o
r
=
(
1
−
s
r
c
A
l
p
h
a
)
∗
s
r
c
C
o
l
o
r
⃗
+
s
r
c
A
l
p
h
a
∗
d
s
t
C
o
l
o
r
⃗
blendColor = (1 - srcAlpha) * \vec {srcColor} + srcAlpha * \vec {dstColor}
blendColor=(1−srcAlpha)∗srcColor+srcAlpha∗dstColor
根据具体的需要决定!
上述颜色混合注意点
上述的实现方式,属于最简单的方式。细心的朋友很容易想到,某个像素的绘制受到底色的制约。也就是说,假如需要绘制透明物体,必须将不透明物体先绘制上去,然后才能达到混合的效果,所以咱们需要注意混合的绘制次序,如下:
- 先绘制不透明物体,保证底色正确
- 有远及近绘制半透明物体,保证近距离透明物体不会遮挡远距离透明物体(按摄像机距离排序)
效果图:
结尾:喜欢的小伙伴点点关注+赞哦!
你们的点赞就是我创作的最大动力!希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!