1.混合2D

Blend 混合是将源色和目标色以某种方式混合生成特效的技术。混合常用来绘制透明或半透明的物体。在混合中起关键作用的α值实际上是将源色和目标色按给定比率进行混合,以达到不同程度的透明。α值为0则完全透明,α值为1则完全不透明。混合操作只能在RGBA模式下进行,颜色索引模式下无法指定α值。物体的绘制顺序会影响到OpenGL的混合处理。

glEnable( GL_BLEND );   // 启用混合
glDisable( GL_BLEND );  // 禁用关闭混合

glBlendFunc( GLenum sfactor , GLenum dfactor );  // 混合函数
sfactor 源混合因子
dfactor 目标混合因子

glBlendFunc( GL_ONE , GL_ZERO );        // 源色将覆盖目标色
glBlendFunc( GL_ZERO , GL_ONE );        // 目标色将覆盖源色
glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的

例如:

若源色为 ( 1.0 , 0.9 , 0.7 , 0.8 )。源色使用 GL_SRC_ALPHA
即 0.8*1.0 , 0.8*0.9 , 0.8*0.8 , 0.8*0.7
结果为 0.8 , 0.72 , 0.64 , 0.56
目标色为 ( 0.6 , 0.5 , 0.4 , 0.3 )。目标色使用GL_ONE_MINUS_SRC_ALPHA
即 1 - 0.8 = 0.2  0.2*0.6 , 0.2*0.5 , 0.2*0.4 , 0.2*0.3
结果为 0.12 , 0.1 , 0.08 , 0.06

由此而见,使用这个混合函数,源色的α值决定了结果颜色的百分比。
这里源色的α值为0.8,即结果颜色中源色占80%,目标色占20%。

2.混合3D

混合3D物体时,基本原理和混合2D物体一样,但需要将深度检测关闭或设置为只读
因为深度检测会剔除被遮挡的部分物体。
glEnable( GL_DEPTH_TEST );          // 启用深度缓存
glDisable( GL_DEPTH_TEST );         // 禁用深度缓存
glDepthMask( GL_FALSE );            // 深度缓存为 只读
glDepthMask( GL_TRUE );             // 深度缓存为 读/写

按以下步骤,可以在 3D 场景中使用混合和深度检测
1、使用深度检测
2、绘制不透明的物体
3、设只读 深度检测
4、绘制半透明的物体
5、设 读/写 深度检测

3.编程实践

#include <GL/glut.h>
#include <stdlib.h>static int leftFirst = GL_TRUE;static void init(void)
{glEnable (GL_BLEND);glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//glBlendFunc(GL_ONE, GL_ONE);   //禁用混合功能glShadeModel (GL_FLAT);glClearColor (0.0, 0.0, 0.0, 0.0);
}static void drawLeftTriangle(void)
{glBegin (GL_TRIANGLES);glColor4f(1.0, 0.0, 0.0, 0.55);glVertex3f(0.1, 0.9, 0.0); glVertex3f(0.1, 0.1, 0.0); glVertex3f(0.7, 0.5, 0.0); glEnd();
}static void drawRightTriangle(void)
{glBegin (GL_TRIANGLES);glColor4f(0.0, 1.0, 0.0, 0.55);glVertex3f(0.9, 0.9, 0.0); glVertex3f(0.3, 0.5, 0.0); glVertex3f(0.9, 0.1, 0.0); glEnd();
}void display(void)
{glClear(GL_COLOR_BUFFER_BIT);if (leftFirst) {drawLeftTriangle();drawRightTriangle();}else {drawRightTriangle();drawLeftTriangle();}glFlush();
}void reshape(int w, int h)
{glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h) gluOrtho2D (0.0, 1.0, 0.0, 1.0*(GLfloat)h/(GLfloat)w);else gluOrtho2D (0.0, 1.0*(GLfloat)w/(GLfloat)h, 0.0, 1.0);
}void keyboard(unsigned char key, int x, int y)
{switch (key) {case 't':case 'T':leftFirst = !leftFirst;glutPostRedisplay();    break;default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (200, 200);glutCreateWindow (argv[0]);init();glutReshapeFunc (reshape);glutKeyboardFunc(keyboard);glutDisplayFunc (display);glutMainLoop();return 0;
}

输出结果如下:

   

左图为关闭“Blend”结果。右图为开启“Blend”结果。

OpenGL编程指南14:混合半透明Blend相关推荐

  1. 《OpenGL编程指南》一第2章 着色器基础

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...

  2. OpenGL编程指南7:视图-

    1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...

  3. OpenGL编程指南5:学习绘制不同风格的曲线

    1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...

  4. OpenGL编程指南4:双缓冲实现运行

    1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...

  5. OpenGL编程指南3:GLUT:OpenGL使用工具库

    1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...

  6. opengl编程指南第8版源码编译详细说明

    1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...

  7. 《OpenGL编程指南(原书第8版)》——计算着色器

    原文  http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...

  8. 《OpenGL编程指南》一第3章 OpenGL绘制方式

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...

  9. 《OpenGL编程指南》一3.2 OpenGL缓存数据

    本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

最新文章

  1. python编程和plc哪个好-plc和python
  2. 【杂谈】为了让大家学好深度学习模型设计和优化,有三AI都做了什么
  3. Tomcat的带有守护程序和关闭挂钩的正常关闭
  4. 管理服务器文件绿色版本,Services.msc服务器文件官方版
  5. python装饰器语法糖_最全python装饰器的各种写法
  6. 20172329 2017-2018-2 《程序设计与数据结构》第五周学习总结
  7. 总线、设备和驱动的关系
  8. 求职者:推销自己的四大妙招
  9. Turbo C 2.0下载地址和安装教程(图解)
  10. 用华为eNSP仿真校园网
  11. 北航大学计算机学院新媒体艺术系,本科优秀毕业论文参考-北航新媒体与艺术学院-北京航空航天大学.doc...
  12. 外星人17r4原版系统_外星人Alienware 17R4 测评/升级
  13. 《网络是怎样连接的》-----户根勤,读书笔记
  14. 游戏应用市场APP软件下载平台网站源码+手机版
  15. 计算机程序ppt,计算机和计算机程序.ppt
  16. 迁移学习和微调深度卷积神经网络
  17. shell脚本入门与Netkeeper破解路由
  18. 【kali-漏洞利用】(3.4)免杀Payload 生成工具(上):Veil安装、启动、Can‘t find the WINE profile问题
  19. cogs 1341 永无乡
  20. document.createEvent建立自定义事件

热门文章

  1. XML注入介绍--XXE,XEE,xpath等
  2. C# 视频监控系列(13):H264播放器——控制播放和截图
  3. 在服务器搭建深度学习环境随笔
  4. C++ code:数值计算之矩形法求解积分问题
  5. Spring Cloud中,Eureka常见问题总结
  6. ORA-04031: Unable To Allocate 32 Bytes Of Shared Memory
  7. vijos1055 奶牛浴场
  8. getAttribute方法在IE6/7下获取href/src属性值的问题
  9. 全新的互动广告牌,待遇男女有别
  10. 「新闻」Google Science Fair