OpenGL编程指南14:混合半透明Blend
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相关推荐
- 《OpenGL编程指南》一第2章 着色器基础
本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...
- OpenGL编程指南7:视图-
1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...
- OpenGL编程指南5:学习绘制不同风格的曲线
1.不同风格曲线绘制 #include <vgl.h> //宏定义;当定义的宏不能用一行表达完整时,可以用"\"表示下一行继续 #define drawOneLine( ...
- OpenGL编程指南4:双缓冲实现运行
1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...
- OpenGL编程指南3:GLUT:OpenGL使用工具库
1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...
- opengl编程指南第8版源码编译详细说明
1. 到:https://github.com/openglredbook/examples 下载完全版的源码examples-master.zip,大小有131MB左右,不要下载缩略版的,否则\bi ...
- 《OpenGL编程指南(原书第8版)》——计算着色器
原文 http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...
- 《OpenGL编程指南》一第3章 OpenGL绘制方式
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...
- 《OpenGL编程指南》一3.2 OpenGL缓存数据
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,第3.2节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...
最新文章
- python编程和plc哪个好-plc和python
- 【杂谈】为了让大家学好深度学习模型设计和优化,有三AI都做了什么
- Tomcat的带有守护程序和关闭挂钩的正常关闭
- 管理服务器文件绿色版本,Services.msc服务器文件官方版
- python装饰器语法糖_最全python装饰器的各种写法
- 20172329 2017-2018-2 《程序设计与数据结构》第五周学习总结
- 总线、设备和驱动的关系
- 求职者:推销自己的四大妙招
- Turbo C 2.0下载地址和安装教程(图解)
- 用华为eNSP仿真校园网
- 北航大学计算机学院新媒体艺术系,本科优秀毕业论文参考-北航新媒体与艺术学院-北京航空航天大学.doc...
- 外星人17r4原版系统_外星人Alienware 17R4 测评/升级
- 《网络是怎样连接的》-----户根勤,读书笔记
- 游戏应用市场APP软件下载平台网站源码+手机版
- 计算机程序ppt,计算机和计算机程序.ppt
- 迁移学习和微调深度卷积神经网络
- shell脚本入门与Netkeeper破解路由
- 【kali-漏洞利用】(3.4)免杀Payload 生成工具(上):Veil安装、启动、Can‘t find the WINE profile问题
- cogs 1341 永无乡
- document.createEvent建立自定义事件
热门文章
- XML注入介绍--XXE,XEE,xpath等
- C# 视频监控系列(13):H264播放器——控制播放和截图
- 在服务器搭建深度学习环境随笔
- C++ code:数值计算之矩形法求解积分问题
- Spring Cloud中,Eureka常见问题总结
- ORA-04031: Unable To Allocate 32 Bytes Of Shared Memory
- vijos1055 奶牛浴场
- getAttribute方法在IE6/7下获取href/src属性值的问题
- 全新的互动广告牌,待遇男女有别
- 「新闻」Google Science Fair