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

2022-04-16 05:00:43
目录
一、混合API二、参数含义2.1 举个栗子2.2 参数含义三、 几种常用混合方式reen); 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,EWxApmFALB1) - (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)

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

其运行效果如下图所示:

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

3.2 混合(GL_ONE, GL_ONE)

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

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

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

其运行效果如下图所示:

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

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

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)比例进行混合。

其运行效果如下图所示:

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

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

前两张纹理混合时:源颜色为蓝色云彩纹理矩形,目标颜色为石头墙纹理矩形。 由于混合比例为 (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与目标颜色值相加。

其运行效果如下图所示:

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

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

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) 相加计算最终的颜色值。

其运行效果如下图所示:

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

附案例代码

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