OpenGL中的混合 (blend)
来源:互联网 发布:开源地面站 安卓源码 编辑:程序博客网 时间:2024/05/19 22:52
glEnable( GL_BLEND ); // 启用混合
glDisable( GL_BLEND ); // 禁用关闭混合
获得混合的信息
glGet( GL_BLEND_SRC );
glGet( GL_BLEND_DST );
glIsEnable( GL_BLEND );
glBlendFunc( GLenum sfactor , GLenum dfactor ); // 混合函数
sfactor 源混合因子
dfactor 目标混合因子
混合因子枚举
GL_DST_ALPHA
( Ad , Ad , Ad , Ad )
GL_DST_COLOR
( Rd , Gd , Bd , Ad )
GL_ONE
(1,1,1,1)
GL_ONE_MINUS_DST_ALPHA
(1,1,1,1) - (Ad,Ad,Ad,Ad)
GL_ONE_MINUS_DST_COLOR
(1,1,1,1) - (Rd,Gd,Bd,Ad)
GL_ONE_MINUS_SRC_ALPHA
(1,1,1,1) - (As,As,As,As)
GL_SRC_ALPHA
( As , As , As , As )
GL_SRC_ALPHA_SATURATE
(f,f,f,1) : f = min(As,1-Ad)
GL_ZERO
( 0 , 0 , 0 , 0 )
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%。
将多边形从远至近排列,并使用以下函数
glBlendFunc( GL_SRC_ALPHA_SATURATE , GL_ONE );
glEnable( GL_POLYGON_SMOOTH );
可以优化多边形反走样;但必须有α位平面,以用来存储累加的覆盖值。
混合 3D 物体
混合 3D 物体时,基本原理和混合2D物体一样,但需要将深度检测关闭或设置为只读。
因为深度检测会剔除被遮挡的部分物体。
glEnable( GL_DEPTH_TEST ); // 启用深度缓存
glDisable( GL_DEPTH_TEST ); // 禁用深度缓存
glDepthMask( GL_FALSE ); // 深度缓存为 只读
glDepthMask( GL_TRUE ); // 深度缓存为 读/写
按以下步骤,可以在 3D 场景中使用混合和深度检测
1、使用深度检测
2、绘制不透明的物体
3、设只读 深度检测
4、绘制半透明的物体
5、设 读/写 深度检测
以下对混合算法进行测试,统一使用glBlendFunc(GL_SRC_ALPHA,GL_ONE);模式。
glClearColor(0.0f,1.0f,0.0f,0.5f); //绿色背景(目标)、先放入帧缓冲区
glColor4f(1.0f,0.0f,0.0f,0.5f); //矩形颜色(源色)、片段
计算结果:
(0.5f, 1.0f,0.0f,0.75f)
绿色背景,红色矩形
关闭混合时 打开混合时 叠加时颜色
结果:
1、背景色也参与混合过程;
2、利用绿色背景测试可得,RGBA中的A值对单一颜色显示没有效果,但混合和
透明是依靠A值计算的;
3、当输入颜色值为RGB时,混合计算时,A值默认为0.0。
- OpenGL中的混合 (blend)
- OpenGL中的混合 (blend)
- OpenGL中的混合 (blend)
- [OpenGL]混合 Blend
- OpenGL ES混合Blend
- OpenGL中的Blend
- OpenGL中的Blend
- OpenGL编程指南14:混合半透明Blend
- 混合 blend
- 使用OpenGL开发时Blend混合的参数选择技巧
- OpenGL中的混合(Blending)
- OpenGL中的混合测试
- OpenGL Blend
- opengl中的混合(gl_blend)
- Shader Blend混合效果
- 【Unity Shader】Blend混合
- opengl之blend and ...
- opengl blend选项
- Android自定义标题栏颜色
- 【JavaSE】javac 命令讲解
- 兼容浏览器的DOM对象自定义属性获取方法
- UNICODE转多字节
- maven 配置在eclipse中
- OpenGL中的混合 (blend)
- ]DWZ表单验证规则一览表
- 继承于Layout的自定义View减少布局层次
- NIO流程
- Python3.x <generator object <genexpr> at 0x0000000002731828>
- sqlserver 死锁以及处理方案
- Java中对日期的操作(获取、比较、排序、间隔)
- 管理媒体播放(2)管理媒体的聚焦
- BEGIN expected in dialog error