透明颜色混合算法

一般数学计算中,颜色取值是: R , G , B ∈ [ 0 , 255 ] , A ∈ [ 0 , 1 ] R,G,B \in \left [ 0, 255 \right ], A\in \left [ 0, 1 \right ] R,G,B[0,255],A[0,1]
所以对于一般的颜色混合有: C o l o r ( R G B A ) = C o l o r ( R 1 G 1 B 1 A 1 ) + C o l o r ( R 2 G 2 B 2 A 2 ) Color(RGBA) = Color(R_{1}G_{1}B_{1}A_{1}) + Color(R_{2}G_{2}B_{2}A_{2}) Color(RGBA)=Color(R1G1B1A1)+Color(R2G2B2A2)

标准的颜色混合算法如下:
A = 1 − ( 1 − α 1 ) ∗ ( 1 − α 2 ) A = 1 - \left ( 1-\alpha _{1} \right )*\left ( 1-\alpha _{2} \right) A=1(1α1)(1α2)
R = 1 A ( α 1 R 1 + ( 1 − α 1 ) α 2 R 2 ) R = \frac{1}{A}(\alpha _{1}R_{1}+ (1 - \alpha _{1})\alpha _{2}R_{2}) R=A1(α1R1+(1α1)α2R2)
G = 1 A ( α 1 G 1 + ( 1 − α 1 ) α 2 G 2 ) G = \frac{1}{A}(\alpha _{1}G_{1}+ (1 - \alpha _{1})\alpha _{2}G_{2}) G=A1(α1G1+(1α1)α2G2)
B = 1 A ( α 1 B 1 + ( 1 − α 1 ) α 2 B 2 ) B = \frac{1}{A}(\alpha _{1}B_{1}+ (1 - \alpha _{1})\alpha _{2}B_{2}) B=A1(α1B1+(1α1)α2B2)

但是在计算机图像中,透明度alpha通常也是 A ∈ [ 0 , 255 ] A \in \left [ 0, 255 \right ] A[0,255]
所以,根据变化得到的代码是:

//浮点数版
float a1 = A1 / 256.0;
float a2 = A2 / 256.0;
float a = 1 - (1 - a1)*(1 - a2);

R = (a1*R1 + (1 - a1)*a2*R2) / a;
G = (a1*G1 + (1 - a1)*a2*G2) / a;
B = (a1*B1 + (1 - a1)*a2*B2) / a;
A = a * 256;

化简后:

float a1 = A1;
float a2 = A2 - (a1 * A2)/256;
float a = a1 + a2;

R = (a1*R1 + a2*R2)/a;
G = (a1*G1 + a2*G2)/a;
B = (a1*B1 + a2*B2)/a;
A = a;
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
根据引用\[1\]和引用\[2\]的描述,shader颜色叠加算法可以通过以下公式表示: 如果当前颜色 <= 0.5 返回1,否则返回0,记作w; 新颜色C = w * 缓存色 * 当前色 * 2 + (1 - w) * (1 - (1 - 缓存色) * (1 - 当前色) * 2); 其中,缓存色是源颜色,当前色是目标颜色。 另外,根据引用\[3\]的描述,还可以使用不同的源因子和目标因子来实现不同的叠加效果。例如: - 如果设置了glBlendFunc(GL_ONE, GL_ZERO),表示完全使用源颜色,完全不使用目标颜色; - 如果设置了glBlendFunc(GL_ZERO, GL_ONE),表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去; - 如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小; - 如果设置了glBlendFunc(GL_ONE, GL_ONE),表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。 综上所述,shader颜色叠加算法可以根据具体的需求和设置来进行调整和实现不同的效果。 #### 引用[.reference_title] - *1* [计算机图形学 Unity ShaderLab 颜色混合运算相关计算方法](https://blog.csdn.net/lengyoumo/article/details/104210066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [OpenGL glBlendFunc() 设置颜色混合 透明度叠加计算](https://blog.csdn.net/wzxxdghdf/article/details/92795557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值