![]()
前面几个参数指定读取的位置尺寸以及格式, 最后一个参数用来返回结果, 所以像素数据自然是读到pixels中。这个要看前面参数怎么指定了,按照你写的那个参数GL_RGB 自然是RGB格式了!
一、原因
那么如果开启深度测试后但是2个重叠的图层中, 有⼀个图层是半透明的 有⼀个图层是⾮半透明的
那么此时就不能进⾏单纯的 ⽐较深度值,然后进⾏覆盖 显示如下图所示:
未使用混合时的显示
其实上面的这样的显示明显是不正确的,为了解决这样的问题,我们需要使用混合。
在OpenGL中,物体透明技术通常被叫做混合(Blending)。
我们先来看看使用混合时显示,如下图所示:
使用混合时的显示
二、混合颜色
目标颜色 已经存储在颜色缓存区的颜色值
源颜色 作为当前渲染命令结果进入颜色缓存区的颜色值
当混合功能被启动时,源颜色和⽬标颜色的组合方式是混合方程式控制的。在默认情况下,混合⽅方程式如下所示:
Cf = (Cs S) + (Cd D)
Cf :最终计算参数的颜色
Cs : 源颜色
Cd :目标颜色
S:源混合因子
D:⽬标混合因子
三、如何使用
1 开启OpenGL的混合功能
glEnable(GL_BLEND);
2关闭OpenGL的混合功能
glDisable(GL_BLEND);
3设置混合因子
glBlendFunc(GLenum S,GLenum D)
S:源混合因⼦子
D:⽬目标混合因⼦子
混合因子如下图:
表中R、G、B、A 分别代表 红、绿、蓝、alpha。
表中下标S、D,分别代表源、⽬标
表中C 代表常量颜⾊(默认⿊⾊)
四、模拟案例
下⾯通过一个常见的混合函数组合来说明问题:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 如果颜⾊缓存区已经有一种颜色红色(10f,00f,00f,00f),这个目标颜色Cd,如果在这上面用⼀种alpha为06的蓝⾊色(00f,00f,10f,06f)
Cd (⽬目标颜⾊色) = (10f,00f,00f,00f)
Cs (源颜⾊色) = (00f,00f,10f,06f);
S = 源alpha值 = 06f
D = 1 - 源alpha值= 1-06f = 04f
⽅方程式Cf = (Cs S) + (Cd D)
等价于 = (Blue 06f) + (Red 04f)
五、修改颜⾊混合⽅程式
默认混合⽅程式:
Cf = (Cs S) + (Cd D)
实际上远不⽌这⼀种混合⽅程式,我们可以从5个不同的⽅程式中进⾏选择 :
1//选择混合⽅程式的函数:
2glbBlendEquation(GLenum mode);
1 常量混合颜⾊,默认初始化为⿊⾊(00f,00f,00f,00f),但是还是可以修改这个常量混
合颜⾊。
2 void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclam
pf alpha );
除了能使用glBlendFunc 来设置混合因子,还可以有更灵活的选择:
void glBlendFuncSeparate(GLenum strRGB,GLenum dstRGB ,GLenum strAlpha,GLenum dstAlpha);
strRGB: 源颜色的混合因子
dstRGB: ⽬标颜色的混合因子
strAlpha: 源颜色的Alpha因子
dstAlpha: ⽬标颜色的Alpha因子
glBlendFunc指定源和⽬标 RGBA值的混合函数;
glBlendFuncSeparate函数则允许为RGB 和 Alpha 成分单独指定混合函数
GL_CONSTANT_COLOR、GL_ONE_MINUS_CONSTANT_COLOR、GL_CONSTANT_ALPHA、GL_ONE_MINUS_CONSTANT值允许混合方程式中引入一个常量混合颜色。
常量混合颜色,默认初始化为⿊色(00f,00f,00f,00f)
修改常量混合颜色
void glBlendColor(GLclampf red ,GLclampf green ,GLclampf blue ,GLclampf alpha )
opengl光源是用rgb颜色格式来表示的是红绿蓝。根据查询相关公开信息显示,OpenGL使用RGB颜色格式来表示光源的原因是RGB是一种被使用的颜色格式,能够提供准确的颜色表示,能够捕捉到空间中的所有光线,使得光源可以更加真实地呈现出来。
了解下glReadPixels参数的含义:
void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid pixels) ;
前面几个参数指定读取的位置尺寸以及格式, 最后一个参数用来返回结果, 所以像素数据自然是读到pixels中。
以上就是关于opengl使用glReadPixels读取纹理颜色为什么全为黑色全部的内容,包括:opengl使用glReadPixels读取纹理颜色为什么全为黑色、六、OpenGL中的颜色混合、opengl光源是用rgb颜色格式来表示的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)