LearnOpenGL学习笔记——混合

OpenGL高级OpenGL篇--混合-20 参考:这里 这一节主要讲混合。 AlphaTest和正常的渲染一样,只需在片元shader中判断alpha和给定的阈值大小来discard片元。 Blend步骤会多一些: 首先要开启混合:glEnable(GL_BLEND); 设置混合方程:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 或者单独设置Alpha:glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZER 阅读详情

混合(个人感觉叫透明度更好些)

OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。这也是混合这一名字的出处,我们混合(Blend)(不同物体的)多种颜色为一种颜色。所以透明度能让我们看穿物体。也就是我们通常说的RGBA,A指的alpha通道。
在这里插入图片描述

丢弃片段

下面是草的纹理,我们将草贴到一个四边形上,放到场景中。
在这里插入图片描述
所以当添加像草这样的植被到场景中时,我们不希望看到草的方形图像,而是只显示草的部分,并能看透图像其余的部分。我们想要丢弃(Discard)显示纹理中透明部分的片段,不将这些片段存储到颜色缓冲中。在此之前,我们还要学习如何加载一个透明的纹理:
加载图片的RGBA

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

从纹理中获取RGBA

void main()
{
    // FragColor = vec4(vec3(texture(texture1, TexCoords)), 1.0);
    FragColor = texture(texture1, TexCoords);
    // 如果纹理的alpha小于1,说明是透明纹理 ,则舍弃该片段
    if(texColor.a < 0.1)
        discard;
    FragColor = texColor;
}

渲染半透明纹理

虽然直接丢弃片段很好,但它不能让我们渲染半透明的图像。我们要么渲染一个片段,要么完全丢弃它。要想渲染有多个透明度级别的图像,我们需要启用混合(Blending)。和OpenGL大多数的功能一样,我们可以启用GL_BLEND来启用混合:

glEnable(GL_BLEND);

启用了混合之后,我们需要告诉OpenGL它该如何混合。OpenGL中的混合是通过下面这个方程来实现的:

在这里插入图片描述
使用glBlendFunc(GLenum sfactor, GLenum dfactor)函数接受两个参数,来设置源和目标因子。OpenGL为我们定义了很多个选项,我们将在下面列出大部分最常用的选项。注意常数颜色向量C¯constant可以通过glBlendColor函数来另外设置。

GL_ZERO 因子等于0
GL_ONE 因子等于1
GL_SRC_COLOR 因子等于源颜色向量C¯source
GL_ONE_MINUS_SRC_COLOR 因子等于1−C¯source
GL_DST_COLOR 因子等于目标颜色向量C¯destination
GL_ONE_MINUS_DST_COLOR 因子等于1−C¯destination
GL_SRC_ALPHA 因子等于C¯source的alpha分量
GL_ONE_MINUS_SRC_ALPHA 因子等于1− C¯source的alpha分量
GL_DST_ALPHA 因子等于C¯destination的alpha分量
GL_ONE_MINUS_DST_ALPHA 因子等于1− C¯destination的alpha分量
GL_CONSTANT_COLOR 因子等于常数颜色向量C¯constant
GL_ONE_MINUS_CONSTANT_COLOR 因子等于1−C¯constant
GL_CONSTANT_ALPHA 因子等于C¯constant的alpha分量
GL_ONE_MINUS_CONSTANT_ALPHA 因子等于1− C¯constant的alpha分量

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);

OpenGL甚至给了我们更多的灵活性,允许我们改变方程中源和目标部分的运算符。当前源和目标是相加的,但如果愿意的话,我们也可以让它们相减。glBlendEquation(GLenum mode)允许我们设置运算符,它提供了三个选项:

GL_FUNC_ADD:默认选项,将两个分量相加:C¯result=Src+Dst。
GL_FUNC_SUBTRACT:将两个分量相减: C¯result=Src−Dst。
GL_FUNC_REVERSE_SUBTRACT:将两个分量相减,但顺序相反:C¯result=Dst−Src。

通常我们都可以省略调用glBlendEquation,因为GL_FUNC_ADD对大部分的操作来说都是我们希望的混合方程。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

在这里插入图片描述
结果不正确,是因为混合和深度测试同时开启。深度测试将后面的片元直接丢弃。当写入深度缓冲时,深度缓冲不会检查片段是否是透明的,所以透明的部分会和其它值一样写入到深度缓冲中。结果就是窗户的整个四边形不论透明度都会进行深度测试。即使透明的部分应该显示背后的窗户,深度测试仍然丢弃了它们。
要想让混合在多个物体上工作,我们需要最先绘制最远的物理,最后绘制最近的物体。普通不需要混合的物体任然可以使用深度缓冲正常绘制。我们仍要保证它们在绘制(排序的)透明物体之前已经绘制完毕了。当绘制一个有不透明和透明物体的场景的时候,大体的原则如下:
1.先绘制所有不透明的物体
2.对所有透明物体排序
3.按顺序绘制所有透明物体
排序透明物体的一种方法是,从观察者视角获取物体的距离。这可以通过计算摄像机位置向量和物体的位置向量之间的距离所获得。接下来我们把距离和它对应的位置向量存储到一个STL库的map数据结构中。map会自动根据键值(Key)对它的值排序,所以只要我们添加了所有的位置,并以它的距离作为键,它们就会自动根据距离值排序了。

//通过计算摄像机位置向量和物体的位置向量之间的距离所获得
std::map<float, glm::vec3> sorted;
for (unsigned int i = 0; i < windows.size(); i++)
{
    float distance = glm::length(camera.Position - windows[i]);
    sorted[distance] = windows[i];
}
//这次在渲染的时候,我们将以逆序(从远到近)从map中获取值,之后以正确的顺序绘制对应的窗户
for(std::map<float,glm::vec3>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); ++it) 
{
    model = glm::mat4();
    model = glm::translate(model, it->second);              
    shader.setMat4("model", model);
    glDrawArrays(GL_TRIANGLES, 0, 6);
}

在这里插入图片描述

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/03%20Blending/

【LearnOpenGL学习笔记】——16.混合测试 文章目录1.丢弃片段2.半透明图形渲染——使用混合(blend)3.练习 1.丢弃片段 丢弃纹理中透明部分的片段,保留不透明部分的片段 如何加载透明纹理? stb_image会自动加载,但我们需要告诉OpenGL 因此使用 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 2.半透明图形渲染——使用混合(blend) (1)混合开启:glEnable(GL_BLEND); 阅读详情

相关推荐

深入理解OpenGL中的混合(Blending)

常见的源像素因子包括GL_SRC_ALPHA和GL_ONE,前者表示源像素的透明度值作为权重,后者表示权重为1。常见的目标像素因子包括GL_ONE_MINUS_SRC_ALPHA和GL_ZERO,前者表示目标像素的透明度值的补数作为权重,后者表示权重为0。然后,我们调用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)来设置源和目标像素因子以及它们的权重。在总结本文之前,需要注意的是,在使用混合时,我们必须首先启用OpenGL的混合功能。

code_welike的博客 510

OpenGL中的混合 (blend)

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

沙漠黑鸟的专栏 2万+

OpenGL混合(Blending)编程

混合函数(Blend Function)用于控制源颜色和目标颜色如何混合,而混合因子(Blend Factor)用于指定源颜色和目标颜色的权重。混合函数(Blend Function)用于控制源颜色和目标颜色如何混合,而混合因子(Blend Factor)用于指定源颜色和目标颜色的权重。这个设置将根据源颜色的alpha值进行混合,使用源颜色的alpha值作为权重,将源颜色与目标颜色进行混合。这个设置将根据源颜色的alpha值进行混合,使用源颜色的alpha值作为权重,将源颜色与目标颜色进行混合。

DevRevolt的博客 466

OpenGL中的Blend(混色)

混色的概念 所谓的混色,就是将当前要绘制的物体的颜色和颜色缓冲区中已经绘制的颜色进行混合,最终决定了当前物体的颜色。 如下图中,我们透过不透明的窗户来看窗外的景色,这就是一种混色。 透明的物体可以是完全透明的(让所有的颜色都穿过),或者是半透明的(让颜色穿过,同时也显示自身的颜色)。 一个物体的透明度是通过它颜色的Alpha值来决定的。Alpha颜色值是颜色分量的第四个分量。 如果是...

100days 5890

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

learnopengl学习笔记——混合

在OpenGl中,混合(Blending)是实现物体透明度(Transparency)的一种技术。透明的意思是一个物体不是纯色(Solid Color)的,其颜色是物体本身的颜色和它背后其他物体颜色的不同强度结合。 决定物体透明度的颜色分量是alpha值,alpha=1时完全不透明,alpha=0时完全透明。alpha=0.5时物体的颜色一半来自自身的颜色,一半来自背后物体的颜色。 丢弃片段 有些图片并不需要半透明,只需要根据纹理颜色值,显示一部分,或者不显示一部分,没有中间情况。比如说草,如果想不太费劲

kiss_the_rian的博客 384

加湿器方案-DLT8M04TS-杰力科创

基本组成: 一个触摸按键、一组RGB灯、一个雾化片、一个充电IC。 产品功能: 第一次上电光机状态,RGB红/绿/红灯依次闪烁灭; 2、按键功能:短按开关机和三档喷雾工作模式,第一次短按持续喷雾,短按第二次喷3S,停3S,短按第三次关闭喷雾模式,依次循环; 在喷雾或是不喷雾的状态下长按1.5S RGB灯渐变,一直循环,第二次长按当前灯光闪烁一下常亮,第三次长按关机; 3、持续喷雾定时5小时自动断电,间歇喷雾定时10小时自动断电,若在间歇工作时有切换为持续喷雾,那间歇喷雾的...

JLKCsz的博客 513

LearnOpenGL学习笔记—高级OpenGL 03:混合

LearnOpenGL学习笔记—高级OpenGL 03:混合1 混合2 完全透明和完全不透明2 混合3 渲染半透明纹理4 注意渲染的顺序5 代码 本节对应官网学习内容:混合 1 混合 在OpenGL中,混合(Blending)通常可以实现物体透明度(Transparency)。 透明是指一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度地结合。 一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的

清清!的博客 1166

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 171

SAP-ABAP:SAP采购业务核心表关联关系详解

MM(核心)、FI(财务)、SD(计划协议):PR → PO → GR → MIRO → FI过账。

baidu_35680696的博客 930

【OpenGL】LearnOpenGL学习笔记14 - 丢弃、混合

LearnOpenGL学习笔记 - 丢弃、混合

Duo1J的随笔 1391

AI智算-K8s如何利用IB RDMA网络加速大模型分布式训练

在AI人工智能领域,大模型的微调是提升性能不可或缺的一环。通过结合InfiniBand RDMA网络的高速互联、Kubernetes的云原生容器化部署,以及智能算力调度平台,可以打造一个高效、灵活且可扩展的分布式训练环境。

Kason_iWiki 816

【learnOpenGL学习笔记_18】OpenGL高级教程 - 透明与混合学习实践

透明与混合是 OpenGL 中实现复杂视觉效果的重要技术。通过合理设置 alpha 通道、启用混合功能以及对透明物体进行排序,我们能够渲染出逼真的透明效果。

同学小张的博客 1221

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(下)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2298

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1912

LearnOpenGL学习笔记—入门05:Texture

小学期终于结束了,可以回来更新了Orz,总是拖拖拉拉的(瘫 0 前言 本节笔记对应的内容 纹理 在入门01中我们配置好了环境 在入门02中我们可以检测输入并出现一个有颜色的窗口 在入门03中我们初步学习了图形渲染管线,尝试用不同方法画出了三角形和四边形 在入门04(上)中我们学习了shader和GLSL的相关知识,并给图形加上了变换的颜色以及彩色。 在入门04(下)中我们建立自己的shader类,并能够从外部读取shader的内容。 在这一节,我们将会了解有关材质的内容 1 纹理简介 在之前的学习中,我们可

清清!的博客 1867

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LearnOpenGL——混合、面剔除

实际的环绕顺序是。

weixin_70073176的博客 1006

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LearnOpenGL14——混合以及处理半透明物体

转载自 https://blog.youkuaiyun.com/qq_36696486/article/details/104409547 https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/03%20Blending/#_1 前言 OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强

白小飞 2007

LearnOpenGL-高级OpenGL-3.混合

OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术 - 透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度**结合**。 - 一个有色玻璃窗是一个透明的物体,玻璃有它自己的颜色,但它最终的颜色还包含了玻璃之后所有物体的颜色。 - 这也是混合这一名字的出处,我们**混合**(Blend)(不同物体的)**多**种颜色为**一**种颜色。所以透明度能让我们看

qq_34060370的博客 878

LearnOpenGL(十七)之混合

LearnOpenGL(十七)之混合

ckg3824278的博客 423

learnOpenGL 4.3 透明混合

在实际场景中,我们会遇到一些透明的物体,如何显示透明物体是一个问题。 RGBA值中A即为透明度,当A非常小,接近或等于零时,我们可以直接在fragment shader中将这些部分舍弃。 void main() { vec4 texColor = texture(texture1, TexCoords); if(texColor.a < 0.1) discard; FragColor = texColor; } 注意,当采样纹理的边

qq_43533956的博客 477

(自用)learnOpenGL学习总结-高级OpenGL-混合

其实就是透明度的意思,在这之前一个图片png格式会有4个通道,最后一个通道就是透明度,他的颜色是由自己的颜色和后面的颜色一起确定的,一般来说 设置为1(完全由自己颜色决定),0.25的意思是自己决定25%。

SHIgaNatsuki的博客 1164

LearnOpenGL 学习笔记 高级 OpenGL

将一个多重采样的纹理图像不进行还原直接传入着色器也是可行的。GLSL提供了这样的选项,让我们能够对纹理图像的每个子样本进行采样,所以我们可以创建我们自己的抗锯齿算法。在大型的图形应用中通常都会这么做。要想获取每个子样本的颜色值,你需要将纹理uniform采样器设置为sampler2DMS,而不是平常使用的sampler2D:使用texelFetch函数就能够获取每个子样本的颜色值了:// 第4个子样本我们不会深入探究自定义抗锯齿技术的细节,这里仅仅是给你一点启发。

hijackedbycsdn的博客 1241

LearnOpenGL CN学习笔记3-渲染第一个三角形

一、图形渲染管线 简介 下图是图形渲染管线的每个阶段的抽象展示。 图形渲染管线 其中,蓝色部分代表的是我们可以注入自定义的着色器的部分。 顶点着色器(Vertex Shader),几何着色器(Geometry Shader),片段着色器(Fragment Shader)。 在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器。 顶点着色器(Vertex Shader):处理3维顶点; 片段着色器(Fragment Shader):光栅化后处理每个像素的颜色,很多特效在这里完..

jean7155的专栏 1199

LearnOpenGL 及 ShaderToy 的 CMake 构建框架

这些构建好的目标是必须的,二进制可执行文件如果使用的是动态库链接,那么运行时会在当前的目录下寻找链接库或者去系统环境变量指定的目录下寻找,为了在 VScode 中能够 F5 一键 Debug ,构建的动态库要放到编译产物的输出安装目录了,静态库的话安不安装倒无所谓……来标注某个函数的导出,这是对于库的构建者来说的,同时对于使用该库的用户,如果使用了分发的接口头文件中的某个接口(函数),也即头文件中给出的接口函数都是开发者编译的动态库中允许导出的符号,则使用者使用函数之前也需要添加属性。

Don_tknowwhat的博客 1148
上一篇: LearnOpenGL学习笔记——模板测试
下一篇: LearnOpenGL学习笔记——面剔除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值