OpenGL ES学习(7)——混合

本文介绍使用是OpenGL ES 混合相关技术,它可以实现如现实世界中那样的半透明物体效果。

1.1 混合基本认识

混合技术就是将两个片元调和,将通过各项测试准备进入帧缓冲的片元(源片元)和原有片元(目标片元)按照设定的比例加权计算出最终片元的颜色值,不再是新片元直接覆盖缓冲中的目标片元。

如何计算两个片元的加权比例?OpenGL ES 2.0中设置混合因子来确定两片元的加权比例。

  • 源因子:用于确定将进入帧缓冲的片元在最终片元的比例;
  • 目标因子:用于确定原帧缓冲中的片元在最终片元中的比例;

OpenGL ES中一个颜色值包括4个色彩通道(r,g,b,a),上述两种因子都各有4个分量值。


混合计算公式

  • 假设源因子[Sr,Sg,Sb,Sa];目标因子[Dr,Dg,Db,Da];r,g,b,a下标分别表示红、绿、蓝、透明度。
  • 假设源片元颜色值[Rs,Gs,Bs,As];目标片元颜色值[Rd,Gd,Bd,Ad]
    混合后最终片元各个颜色通道值 = [ R   s   S   r   + R   d   D   r   , G   s   S   g   + G   d   D   g   , B   s   S   b   + B   d   D   b   , A   s   S   a   + A   d   D   a   ] 混合后最终片元各个颜色通道值 = [R~s~S~r~+R~d~D~r~,G~s~S~g~+G~d~D~g~,B~s~S~b~+B~d~D~b~,A~s~S~a~+A~d~D~a~] 混合后最终片元各个颜色通道值=[R s S r +R d D r ,G s S g +G d D g ,B s S b +B d D b ,A s S a +A d D a ]

1.2 源因子和目标因子

OpenGL ES为了简化处理不允许开发人员任意设置混合因子,而是系统预置了。常用的混合因子值如下表所示:

常量名RGB混合因子A混合因子
GL_ZERO[0,0,0]0
GL_ONE[1,1,1]1
GL_SRC_COLOR[Rs,Gs,Bs]As
GL_ONE_MINUS_SRC_COLOR[1-Rs,1-Gs,1-Bs]1-As
GL_DST_COLOR[Rd,Gd,Bd]Ad
GL_ONE_MINUS_DST_COLOR[1-Rd,1-Gd,1-Bd]1-Ad
GL_SRC_ALPHA[As,As,As]As
GL_ONE_MINUS_SRC_ALPHA[1-As,1-As,1-As]1-As
GL_DST_ALPHA[Ad,Ad,Ad]Ad
GL_ONE_MINUS_DST_ALPHA[1-Ad,1-Ad,1-Ad]1-Ad
GL_SRC_ALPHA_SATURATE
(只可以作源因子)
[f,f,f]
其中f=min(As,1-Ad)
1

常量名称中包含“SRC”的代表各通道来自源片元,有DST的代表各通道值来自目标片元。


两种常用的组合

  • 源因子GL_SRC_ALPHA + 目标因子GL_ONE_MINUS_SRC_ALPHA ,可实现半透明遮挡效果
  • 源因子GL_SRC_COLOR + 目标因子GL_ONE_MINUS_SRC_COLOR ,可实现滤光镜效果

1.3 混合代码API

//开启混合
GLES20.glEnable(GLES20.GL_BLEND);
//设置混合因子,滤光镜效果
GLES20.glBlendFunc(GLES20.GL_SRC_COLOR, GLES20.GL_ONE_MINUS_SRC_COLOR);
//设置混合因子,半透明遮挡效果
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,GLES20.GL_ONE_MINUS_CONSTANT_ALPHA);

//...
//关闭混合
GLES20.glDisable(GLES20.GL_BLEND);

1.4 混合demo

1.4.1 demo效果

在这里插入图片描述

1.4.2 完整demo

https://download.youkuaiyun.com/download/ITMonkeyKing/86504570

【参考】

  1. https://www.khronos.org/opengles/
  2. 《OpenGL ES应用开发实践指南 Android卷 Kevin Brothaler》
  3. https://en.wikipedia.org/wiki/OpenGL_ES
  4. https://developer.android.google.cn/guide/topics/graphics/opengl
  5. https://developer.android.google.cn/training/graphics/opengl
  6. Android3D游戏开发技术宝典OpenGL ES 2.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值