一文详解 OpenGL ES 纹理颜色混合的方法

 更新时间:2021年12月16日 09:47:30   作者:xiaxveliang  
在OpenGL中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合。怎么实现这个效果呢,下面小编给大家带来了OpenGL ES 纹理颜色混合的实现方法,感兴趣的朋友跟随小编一起看看吧

在OpenGL中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合。例如:想使物体拥有半透明的效果,或者绘制叠加光亮的效果,这时候就需要用到OpenGLES混合

如上图所示,为石头墙、绿色矩形、蓝色云彩 三个矩形混合后的展示效果。三个矩形(Z轴深度由深到浅)分别为,石头墙、绿色矩形、蓝色云彩。

一、混合API

在OpenGLES中若使用混合,需要用到API函数方法(Java):
void glBlendFunc( int srcfactor, int destfactor );

(1) 其OpenGL函数原型为:
void glBlendFunc(GLenum srcfactor, GLenum destfactor);

(2) 其功能为:
控制新画上来的颜色 (source values, RGBA) 和 已经在帧缓冲区中的颜色 (destination values, RGBA) 的混合时源与目标 在最终颜色通道中所占的比例

(3) 方法参数

  • srcfactor:代表源因子,即新画上来的颜色。

该参数由九个枚举型被接受使用:
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.

  • destfactor:代表的是目标因子,即已经在帧缓冲区中的颜色。

该参数由八个枚举型被接受使用:
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

二、参数含义

  • 举个栗子
  • 参数含义

2.1 举个栗子

我们先看一个常用混合参数搭配:

// 最常用的混合因子搭配方式
// 即源因子为 GL_SRC_ALPHA 目标因子为 GL_ONE_MINUS_SRC_ALPHA 
glBlendFunc(GL30.GL_SRC_ALPHA, GL30.GL_ONE_MINUS_SRC_ALPHA);

以上参数搭配方式假设:

  • (Sr, Sg, Sb, Sa)代表源颜色src(要绘制的颜色)
  • (Dr, Dg, Db, Da)代表目标颜色Dest(缓冲区中颜色)

如果源因子的不透明度为0.2(透明度0.8),alpha值的最大值为1,那么源与目标混合后的最终颜色值为:

// 最终颜色值为:0.2*S+0.8*D
// OpenGL ES 最终颜色计算结果如下:
(0.2*Sr+(1-0.2)*Dr , 0.2*Sg+(1-0.2)*Dg , 0.2*Sb+(1-0.2)*Db,0.2*Sa+(1-0.2)*Da)

启用混合与纹理矩形绘制顺序代码举例:

// 开启混合  
gl.glEnable(GL10.GL_BLEND);  
// 指定混合比例
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
  
// 绘制石头墙纹理矩形
gl.glPushMatrix();  
gl.glTranslatef(-0.8f, -0.8f, -0.02f);  
wallRect.drawSelf(gl, tex_wall);  
gl.glPopMatrix();  
  
// 绘制绿色纹理矩形
gl.glPushMatrix();  
gl.glTranslatef(0, 0, -0.01f);  
greenRect.drawSelf(gl, tex_green);  
gl.glPopMatrix();  
  
// 绘制蓝色云彩纹理矩形
gl.glPushMatrix();  
gl.glTranslatef(0.8f, 0.8f, 0f);  
cloudRect.drawSelf(gl, tex_cloud);  
gl.glPopMatrix();`

2.2 参数含义

有了上边的例子,我们再回来看各个参数因子。

假设:

  • (Sr, Sg, Sb, Sa)代表源颜色src(要绘制的颜色)
  • (Dr, Dg, Db, Da)代表目标颜色Dest(缓冲区中颜色)
  • (Kr, Kg, Kb, Ka)代表缓冲区中各个通道R, G, B, A的最大值。

那么各个参数因子所代表的值如下表所示:

混合因子 各颜色通道色彩比例值
GL_ZERO (0,0,0,0)
GL_ONE (1,1,1,1)
GL_SRC_COLOR (Sr/Kr, Sg/Kg, Sb/Kb, Sa/Ka)
GL_DST_COLOR (Dr/Kr, Dg/Kg, Db/Kb, Da/Ka)
GL_ONE_MINUS_SRC_COLOR (1,1,1,1) - (Sr/Kr,Sg/Kg,Sb/Kb,Sa/Ka)
GL_ONE_MINUS_DST_COLOR (1,1,1,1) - (Dr/Kr,Dg/Kg,Db/Kb,Da/Ka)
GL_SRC_ALPHA ( Sa/Ka, Sa/Ka, Sa/Ka, Sa/Ka )
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (Sa/Ka,Sa/Ka,Sa/Ka,Sa/Ka)
GL_DST_ALPHA ( Da/Ka, Da/Ka, Da/Ka, Da/Ka )
GL_ONE_MINUS_DST_ALPHA (1,1,1,1) - (Da/Ka,Da/Ka,Da/Ka,Da/Ka)
GL_SRC_ALPHA_SATURATE (min(Sa, Ka, Da)/Ka,min(Sa, Ka, Da)/Ka,min(Sa, Ka, Da)/Ka,1)

三、 几种常用混合方式效果

下边以三张纹理图片在不同混合因子设置下的效果图,对几种常见的混合效果进行举例说明。

  • 其中 离摄像机最远的为一张 Alpha=1.0石头墙纹理图;
  • 其次 为一张 Alpha=0.6蓝色云彩纹理图;
  • 最后离摄像机最近的为一张 Alpha=0.4的绿色纹理图。

3.1 混合(GL_ONE, GL_ZERO)

源颜色(最后绘制的绿色矩形)参数因子为GL_ONE,目标色(缓冲区中颜色)参数因子为GL_ZERO。

这种参数因子组合混合比例 (1.0, 0.0)

  • 源颜色(最后绘制的绿色矩形)覆盖目标色(缓冲区中颜色);
  • 目标色(缓冲区中颜色)不起作用,

其运行效果如下图所示:

3.2 混合(GL_ONE, GL_ONE)

源颜色(最后绘制的绿色矩形)与 目标色(缓冲区中颜色)均为GL_ONE。

这种参数因子组合混合比例 (1.0, 1.0)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色)在混合时,源与目标的色彩通道颜色所占的比例相同

其运行效果如下图所示:

仔细观察以上效果图,可以看到三张图片叠加部分,几乎为白色。

3.3 混合(GL_ONE, GL_ONE_MINUS_DST_ALPHA)

源颜色(最后绘制的绿色矩形)参数因子为 GL_ONE,目标色(缓冲区中颜色)参数因子为 GL_ONE_MINUS_DST_ALPHA。

这种参数因子组合混合比例 (1.0, 1.0-Da/Ka)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色),在混合时取源颜色 (1- Da/Ka)比例进行混合。

其运行效果如下图所示:

观察以上效果图:可以看到最上边绿色矩形占最终混合颜色的比例较高。
三张纹理绘制时:

  • 前两张纹理混合时:源颜色为蓝色云彩纹理矩形,目标颜色为石头墙纹理矩形
  • 由于混合比例为 (1.0, 1.0-Da/Ka),混合后的最终颜色只显示蓝色云彩纹理矩形(石头墙纹理的ALPHA=1.0,最终石头墙颜色所占的比例 1.0-1.0=0.0,比例为0)。
  • 其次绿色纹理矩形缓冲区中颜色进行混合:源颜色为绿色纹理矩形,目标颜色为缓冲区中颜色

混合后的最终颜色基本只显示绿色纹理矩形(蓝色云彩纹理矩形的ALPHA=0.6,(1-0.6)云纹理与绿色矩形混合后,几乎看不到云纹理的颜色)。

3.4 混合 (GL_SRC_ALPHA, GL_ONE)

源颜色(最后绘制的绿色矩形)参数因子为 GL_SRC_ALPHA,目标色(缓冲区中颜色)参数因子为 GL_ONE。

这种参数因子组合混合比例 (Sa/Ka, 1.0)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色),在混合时以源颜色值乘以Sa/Ka与目标颜色值相加。

其运行效果如下图所示:

观察以上效果图,可以看出目标墙面与云纹理混合后墙面纹理颜色值所占比例较高,三个纹理图片叠加部分有些像素点为白色。

3.5 混合 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

这种方式是最常用的混合方式,源颜色(最后绘制的绿色矩形)参数因子为 GL_SRC_ALPHA,目标色(缓冲区中颜色)参数因子为 GL_ONE_MINUS_SRC_ALPHA。

这种参数因子组合混合比例 (Sa/Ka, 1.0-Sa/Ka)

  • 源颜色(最后绘制的绿色矩形)目标色(缓冲区中颜色)在混合时,取源颜色的 (Sa/Ka) 与目标颜色 (1.0-Sa/Ka) 相加计算最终的颜色值。

其运行效果如下图所示:

附案例代码

案例源码下载地址:
https://download.csdn.net/download/aiwusheng/64038379

到此这篇关于一文详解 OpenGL ES 纹理颜色混合的文章就介绍到这了,更多相关OpenGL ES 纹理颜色混合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在QQ群中接入ChatGPT机器人的操作方法

    在QQ群中接入ChatGPT机器人的操作方法

    这篇文章主要介绍了如何在QQ群中接入ChatGPT机器人,今天我们的分享主要围绕着大部分用户Windows电脑,基于nodejs,需要的朋友可以参考下
    2023-02-02
  • 基于chatgpt开发QQ机器人原理分析

    基于chatgpt开发QQ机器人原理分析

    ChatGPT是当前自然语言处理领域的重要进展之一,可应用于多种场景,如智能客服、聊天机器人、语音助手等。本文通过调用OpenAI GPT-3模型提供的Completion API来实现一个更加智能的QQ机器人,文中原理代码介绍的非常详细,感兴趣的同学可以参考下
    2023-05-05
  • OAuth从1.0到2.1的发展之路

    OAuth从1.0到2.1的发展之路

    OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。简单来说就是提供除了"账户密码"验证方式以外的验证授权方式。这篇文章介绍了OAuth从1.0到2.1的发展之路,感兴趣的同学可以收藏一下
    2021-11-11
  • spark通过kafka-appender指定日志输出到kafka引发的死锁问题

    spark通过kafka-appender指定日志输出到kafka引发的死锁问题

    这篇文章主要介绍了spark通过kafka-appender指定日志输出到kafka引发的死锁,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 神兵利器系列之nessus8.8安装破解使用教程

    神兵利器系列之nessus8.8安装破解使用教程

    Nessus 是全世界最多人使用的系统漏洞扫描与分析工具。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统。本文给大家分享神兵利器系列之nessus8.8安装破解使用教程,感兴趣的朋友一起看看吧
    2022-01-01
  • Git的基础文件操作初始化查看添加提交示例教程

    Git的基础文件操作初始化查看添加提交示例教程

    这篇文章主要为大家介绍了Git的基础文件操作初始化查看添加提交示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 使用GitLab+Jenkins实现持续集成CI环境的示例代码

    使用GitLab+Jenkins实现持续集成CI环境的示例代码

    本文主要介绍了使用GitLab+Jenkins实现持续集成CI环境的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Typora导出Word格式操作

    Typora导出Word格式操作

    这篇文章主要介绍了Typora导出Word格式操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • EventStore文件存储设计详解

    EventStore文件存储设计详解

    ENode是一个CQRS+Event Sourcing架构的开发框架,这篇文章主要介绍了EventStore文件存储设计 ,需要的朋友可以参考下
    2019-05-05
  • 基于 Dubbo Admin 临时踢除问题服务实例步骤

    基于 Dubbo Admin 临时踢除问题服务实例步骤

    服务在线上运行的过程中,难免遇到某些节点有问题,为了不影响整体服务的正常运行,需要临时下线问题的服务实例,这篇文章主要介绍了基于 Dubbo Admin 临时踢除问题服务实例,需要的朋友可以参考下
    2022-12-12

最新评论