android中的透明色,Android OpenGL ES (五) 透明

关于透明,OpenGL/ES 中可以通过 blend (混色) 来简单实现,混色的基本原理就是把要绘制的物体的颜色与屏幕上已经绘制好的颜色以一定比例来混合,最后的颜色看上去就像半透明一样。

要使用混合先要通过 glEnable 函数来启用

然后通过 glBlendFunc 来设置下要使用的混合方法

sfactor 及 dfactor 分别代表源和目标颜色在混合时所占比重的枚举常量。其中 sfactor 可取值包括:GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA_SATURATE ; 而 dfactor 可取值包括:GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA。

以下说明及公式中所涉及颜色的R、G、B、A值都是指浮点形式,即范围在 0.0f – 1.0f 之间。

在计算混色时,首先是根据以上的枚举得出源颜色和目标颜色的系数,然后分别与源和目标颜色相乘(乘积大于1时取值1),然后再把得出的结果相加。那么如果假设根据以上枚举得出的RGBA四个成分上的系数分别为 源 sfR, sfG, sfB, sfA, 目标 dfR, dfG, dfB, dfA, 源和目标的颜色成分值分别用 sR, sG, sB, sA 和 dR, dG, dB, dA 表示的话, 最终结果色的 rR, rG, rB, rA 分别为:

rR = sR * sfR + dR * dfR

rG = sG * sfG + dG * dfG

rB = sB * sfB + dB * dfB

rA = sA * sfA + dA * dfA

以上 rR, rG, rB, rA 的值如果大于 1 则最终取值为 1 。

然后再来看看 xfR, xfG, xfB, xfA ( x => s / d )是怎么得出来的。

factor枚举

xfR, xfG, xfB, xfA

GL_ZERO

0, 0, 0, 0

GL_ONE

1, 1, 1, 1

GL_SRC_COLOR

sR, sG, sB, sA

GL_DST_COLOR

dR, dG, dB, dA

GL_ONE_MINUS_SRC_COLOR

1-sR, 1-sG, 1-sB, 1-sA

GL_ONE_MINUS_DST_COLOR

1-dR, 1-dG, 1-dB, 1-dA

GL_SRC_ALPHA

sA, sA, sA, sA

GL_DST_ALPHA

dA, dA, dA, dA

GL_ONE_MINUS_SRC_ALPHA

1-sA, 1-sA, 1-sA, 1-sA

GL_ONE_MINUS_DST_ALPHA

1-dA, 1-dA, 1-dA, 1-dA

GL_SRC_ALPHA_SATURATE

i, i, i, 1 *

上边的表中最后的 i 取值为 min ( sA, 1-dA )

根据以上公式,

glBlendFunc(GL_ONE, GL_ONE); 即源与目标颜色的RGBA分别相加。

glBlendFunc(GL_ONE, GL_ZERO); 即只取源颜色,这也是默认值。

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 是比较典型的半透明效果,如果源色 alpha 为0,则取目标色,如果源色alpha为1,则取源色,否则视源色的alpha大小各取一部分。源色的alpha越大,则源色取的越多,最终结果源色的表现更强;源色的alpha越小,则目标色“透过”的越多。

此外在一般的渲染过程中,都会把有半透明效果的渲染放到后边,先把不透明的部分在深度测试启用的情况下渲染完, 再关闭深度测试写入(glDepthMask(false)),并渲染半透明的部分。这样就不会出现由于半透明且离镜头近的面被先渲染时污染深度缓冲了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值