您的位置:首页 > 运维架构

8.OpenGL学习之颜色混合

2018-01-07 15:40 405 查看

颜色混合

  通常情况下OpenGL渲染时会把颜色值放在颜色缓冲区中。每个片段的深度值也是放在深度缓冲区中的。当深度测试被关闭(禁用)时,新的颜色值简单得覆盖颜色缓冲区中已经存在的其他值。当深度测试被打开(启用)时,新的颜色片段只有当它们比原来的值更接近邻近的裁剪平面时才会替换原来的颜色片段。在正常情况下,任何绘制不是被完全丢弃,就是完全覆盖原来的颜色值,这取决于深度测试的结果。如果打开了OpenGL的混合功能,那么下层的颜色值就不会被清除。

glEnable(GL_BLEND);


在打开混合功能的情况下,新的颜色会与已经存在的颜色值在颜色缓冲区进行组合。这些颜色的组合方式不同会导致很多不同的特殊效果。

组合颜色

  假设绘制这样一个场景:透过红色的玻璃看绿色的物体。那么可以先绘制绿色的物体,再绘制红色的玻璃。在绘制红色的玻璃时,利用颜色混合得到一种新的颜色,使玻璃看起是半透明的。

已经存储在颜色缓冲区中的颜色值叫做目标颜色,即上面的绿色。作为当前渲染命令的结果进入颜色缓冲区的颜色值称为源颜色,即上面玻璃的红色。

当混合功能被开启时,源颜色和目标颜色的组合方式是由混合方程式控制的。默认情况下,混合方程式如下所示。



其中,Cf是最终计算产生的颜色,Cs是源颜色,Cd则是目标颜色,S和D分别是源和目标混合因子。这写混合因子是用下面函数进行设置。

void glBlendFunc (GLenum S, GLenum D);


S和D都是枚举值,而不是可以直接指定的实际值。 下图列出了混合函数可以使用的值。其中下标表示源、目标和颜色。R、G、B和A分别代表红、绿、蓝和alpha。



我们通过一个常见的混合颜色组合来举例说名。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


这个函数告诉OpenGL接受源源颜色并将这个颜色(RGB值)与alpha值相乘,然后把这个结果加上目标颜色乘以“1减去源颜色的alpha值”的结果。

这个混合函数经常用于实现在其他一些不透明的物体前面绘制一个透明物体的效果。但是,这种技巧需要首先绘制一个或多个背景物体,然后再在上面绘制经过混合的透明物体。

改变混方程式

上面提及的混合方程式是默认的。实际上我们可以从五种不同的混合方程式进行选择,如下图所示,我们可以通过下面函数进行选择。

void glBlendEquation(GLenum mode);




示例演示

设置颜色混合。将颜色RGB(1.0,1.0,0.0)和50%透明效果的纹理绘制立方体。

void MyQGLWidget::initializeGL()
{
loadGLTextures();
glEnable(GL_TEXTURE_2D);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清除屏幕所用的颜色
glShadeModel(GL_SMOOTH);   // 平滑方式,这也是默认方式
glClearDepth(1.0);//设置深度缓存
glEnable(GL_DEPTH_TEST);  // 启用深度测试
glDepthFunc(GL_LEQUAL);  //设置深度测试类型

glEnable(GL_BLEND);                         //开启混合
glDisable(GL_DEPTH_TEST);                   //关闭深度测试
glColor4f(1.0f, 1.0f, 0.0f, 0.5f);                  //50%Alpha混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE);                  //基于源像素alpah通道值得半透明混合函数
}


运行结果:



代码下载

OpenGL学习系列导航
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: