LearnOpenGL学习笔记——抗锯齿

OpenGL MSAA:抗锯齿技术详解 抗锯齿 anti-aliasing 一 概念 有时候OpenGL渲染出来的物体,其边缘会出现锯齿,显得很不丝滑。说白了,使物体在渲染时保持边缘丝滑而不出现锯齿的技术,就叫做抗锯齿。常用的技术是SSAA和MSAA,MSAA是SSAA的演进技术,全称是多采样点抗锯齿 multisampler anti-aliasing,本文主要介绍MSAA. 二 MSAA原理 片段着色器携带顶点数据运行时,将数据插入到像素的中心,MSAA随后使用一个很大的的带有设置了子采样点的深度/模板缓冲去选择哪些子采样点被覆盖,然 阅读详情

如何开启抗锯齿

原理见末尾链接

glfwWindowHint(GLFW_SAMPLES, 4);
glEnable(GL_MULTISAMPLE);// 一般默认是打开状态

离屏MSAA

由于GLFW负责了创建多重采样缓冲,启用MSAA非常简单。然而,如果我们想要使用我们自己的帧缓冲来进行离屏渲染,那么我们就必须要自己动手生成多重采样缓冲了。

有2种方式生成多重采样缓冲,将其作为帧缓冲的附件:纹理附件和渲染缓冲附件,这和在帧缓冲教程中所讨论的普通附件很相似。

多重采样纹理附件
为了创建一个支持储存多个采样点的纹理,我们使用glTexImage2DMultisample来替代glTexImage2D,它的纹理目标是GL_TEXTURE_2D_MULTISAPLE。

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, width, height, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

它的第二个参数设置的是纹理所拥有的样本个数。如果最后一个参数为GL_TRUE,图像将会对每个纹素使用相同的样本位置以及相同数量的子采样点个数。我们使用glFramebufferTexture2D将多重采样纹理附加到帧缓冲上,但这里纹理类型使用的是GL_TEXTURE_2D_MULTISAMPLE。

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);

当前绑定的帧缓冲现在就有了一个纹理图像形式的多重采样颜色缓冲。

多重采样渲染缓冲对象
和纹理类似,创建一个多重采样渲染缓冲对象并不难。我们所要做的只是在指定(当前绑定的)渲染缓冲的内存存储时,将glRenderbufferStorage的调用改为glRenderbufferStorageMultisample就可以了。

glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, width, height);

渲染到多重采样帧缓冲
渲染到多重采样帧缓冲对象的过程都是自动的。只要我们在帧缓冲绑定时绘制任何东西,光栅器就会负责所有的多重采样运算。我们最终会得到一个多重采样颜色缓冲以及/或深度和模板缓冲。因为多重采样缓冲有一点特别,我们不能直接将它们的缓冲图像用于其他运算,比如在着色器中对它们进行采样。

一个多重采样的图像包含比普通图像更多的信息,我们所要做的是缩小或者还原(Resolve)图像。多重采样帧缓冲的还原通常是通过glBlitFramebuffer来完成,它能够将一个帧缓冲中的某个区域复制到另一个帧缓冲中,并且将多重采样缓冲还原。

glBlitFramebuffer会将一个用4个屏幕空间坐标所定义的源区域复制到一个同样用4个屏幕空间坐标所定义的目标区域中。你可能记得在帧缓冲教程中,当我们绑定到GL_FRAMEBUFFER时,我们是同时绑定了读取和绘制的帧缓冲目标。我们也可以将帧缓冲分开绑定至GL_READ_FRAMEBUFFER与GL_DRAW_FRAMEBUFFER。glBlitFramebuffer函数会根据这两个目标,决定哪个是源帧缓冲,哪个是目标帧缓冲。接下来,我们可以将图像位块传送(Blit)到默认的帧缓冲中,将多重采样的帧缓冲传送到屏幕上。

glBindFramebuffer(GL_READ_FRAMEBUFFER, multisampledFBO);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

但如果我们想要使用多重采样帧缓冲的纹理输出来做像是后期处理这样的事情呢?我们不能直接在片段着色器中使用多重采样的纹理。但我们能做的是将多重采样缓冲位块传送到一个没有使用多重采样纹理附件的FBO中。然后用这个普通的颜色附件来做后期处理,从而达到我们的目的。然而,这也意味着我们需要生成一个新的FBO,作为中介帧缓冲对象,将多重采样缓冲还原为一个能在着色器中使用的普通2D纹理。这个过程的伪代码是这样的:

unsigned int msFBO = CreateFBOWithMultiSampledAttachments();
// 使用普通的纹理颜色附件创建一个新的FBO
...
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, screenTexture, 0);
...
while(!glfwWindowShouldClose(window))
{
    ...
    glBindFramebuffer(msFBO);
    ClearFrameBuffer();
    DrawScene();
    // 将多重采样缓冲还原到中介FBO上
    glBindFramebuffer(GL_READ_FRAMEBUFFER, msFBO);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, intermediateFBO);
    glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
    // 现在场景是一个2D纹理缓冲,可以将这个图像用来后期处理
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    ClearFramebuffer();
    glBindTexture(GL_TEXTURE_2D, screenTexture);
    DrawPostProcessingQuad();  
    ... 
}

你可以看到,如果将多重采样与离屏渲染结合起来,我们需要自己负责一些额外的细节。但所有的这些细节都是值得额外的努力的,因为多重采样能够显著提升场景的视觉质量。当然,要注意,如果使用的采样点非常多,启用多重采样会显著降低程序的性能。在本节写作时,通常采用的是4采样点的MSAA。

自定义抗锯齿算法

将一个多重采样的纹理图像不进行还原直接传入着色器也是可行的。GLSL提供了这样的选项,让我们能够对纹理图像的每个子样本进行采样,所以我们可以创建我们自己的抗锯齿算法。在大型的图形应用中通常都会这么做。
要想获取每个子样本的颜色值,你需要将纹理uniform采样器设置为sampler2DMS,而不是平常使用的sampler2D:

uniform sampler2DMS screenTextureMS;

使用texelFetch函数就能够获取每个子样本的颜色值了:

vec4 colorSample = texelFetch(screenTextureMS, TexCoords, 3);  // 第4个子样本

https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/11%20Anti%20Aliasing/

OpenGL核心技术之抗锯齿 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144  抗锯齿在游戏中一直存在的,尤其是提现在3D模型上或者游戏UI界面上,由于现在引擎都非常完善,它们 阅读详情

相关推荐

LearnOpenGL——抗锯齿

关于抗锯齿技术的原理可以参考另外一篇笔记。

weixin_70073176的博客 1217

LearnOpenGL学习笔记—高级OpenGL 11:抗锯齿

LearnOpenGL学习笔记—高级OpenGL 11:抗锯齿1 知识回顾2 OpenGL中的MSAA3 离屏MSAA 本节对应官网学习内容:抗锯齿 1 知识回顾 关于抗锯齿的话题在我的博客里老生常谈了 看 这一节 笔记,就能对抗锯齿或者说是反走样以及走样的产生的原理理解的很透彻了 官网主要详细介绍了下MSAA的原理,可以点进去结合起来看看,不再赘述。 2 OpenGL中的MSAA 如果我们想要在OpenGL中使用MSAA,我们必须要使用一个能在每个像素中存储大于1个颜色值的颜色缓冲(因为多重采样需要我们为

清清!的博客 1663

Pinocchio 安装教程|机器人学的必备库

安装pinocchio,不要安装pip3 install pinocchio!

darcsdn 1660

OpenGL学习笔记一之高级OpenGL篇十一 抗锯齿

转载自https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/11%20Anti%20Aliasing/ 在学习渲染的旅途中,你可能会时不时遇到模型边缘有锯齿的情况。这些锯齿边缘(Jagged Edges)的产生和光栅器将顶点数据转化为片段的方式有关。在下面的例子中,你可以看到,我们只是绘制了一个简单的立方体,你就能注意到它存在锯齿边缘了...

飞飞飞的博客 1852

Mujoco xml actuator

在MuJoCo中,actuator(执行器) 是用于定义外部力或力矩的机制,这些力或力矩可以作用于关节、肌腱或身体。执行器可以模拟各种类型的驱动器,如电机、液压缸、肌肉等。它们通过定义传输(transmission)和力生成机制(force generation)来实现对模型的控制。

m0_52113469的博客 2899

用Arduino Mega2560和TB6612驱动MG513电机,我踩过的坑和最佳实践

本文详细介绍了使用Arduino Mega2560和TB6612驱动模块控制MG513直流电机的实战经验,包括硬件连接、PWM配置、编码器信号处理等关键技巧。通过优化电源系统、信号线布局和软件控制算法,有效解决了电机抖动、转速不稳等常见问题,为机器人底盘和自动化项目提供了可靠解决方案。

weixin_42520573的博客 202

vulkan_延迟渲染中使用MSAA技术

本部分主要来看一下在使用延迟渲染基础上采用多重采样技术来解决抗锯齿问题,至于延迟渲染便不再赘述,有兴趣可参照之前实现了解vulkan_延迟渲染。 一、实现原理: 了解延迟渲染原理的话,你肯定会知道延迟渲染的缺陷之一便是:不能使用硬件AA(MSAA),所以使用了延迟渲染之后,UE4等引擎只支持FXAA跟TXAA。 本部分我们主要是讲述在vulkan延迟渲染中实现MSAA: CPU端查看硬件支持的多从采样量级数; 通过GLSL中texelFetch函数,采样各LOD级别的纹素; 对每个纹素平均Ambient.

qq_35312463的博客 1760

MPU6050数据融合避坑指南:当欧拉角遇到万向节死锁,我们该如何处理?

本文深入探讨了MPU6050在姿态解算中遇到的欧拉角万向节死锁问题,提供了四元数解决方案及工程实践策略。通过分析死锁现象的本质,介绍四元数的优势与实现方法,并给出必须使用欧拉角时的三种应对方案,帮助开发者有效规避数据跳变和解算失效问题。

weixin_30415113的博客 541

【OpenGL】LearnOpenGL学习笔记21 - MSAA 多重采样抗锯齿

LearnOpenGL学习笔记 - MSAA 多重采样抗锯齿

Duo1J的随笔 1510

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 426

LTX-2.3 V1.6:8G显存本地AI视频生成工具与int8量化加速实践

这次我们来看一个本地部署的AI视频生成工具——LTX-2.3文字图片生成带音频视频工具V1.6版本。这个工具最大的特点是支持int8量化加速,相比原版提速2-4倍,效果更好,而且8G显存就能运行,不需要搭建复杂环境,解压即可使用。 对于想要在本地电脑上快速生成带音频视频内容的用户来说,这个工具解决了几个关键痛点:首先是硬件门槛低,8G显存意味着大多数主流游戏显卡都能胜任;其次是部署简单,避免了Python环境配置、依赖包冲突等常见问题;最后是性能优化明显,int8加速让生成速度大幅提升。 本文会重点演示如何

hqmln的博客 1235

LearnOpenGL_抗锯齿

抗锯齿 锯齿边缘(Jagged Edges)的产生和光栅器将顶点数据转化为片段的方式有关。 清楚看见形成边缘的像素称之为走样(Aliasing)。有很多种抗锯齿(Anti-aliasing,也被称为反走样)的技术能够帮助我们缓解这种现象,从而产生更平滑的边缘。 最开始的抗锯齿方式-超采样抗锯齿(Super Sample Anti-aliasing, SSAA)的技术,它会使用比正常分辨...

hunter_wyh 365

11、rsa-目标主机支持RSA密钥交换【原理扫描】的漏洞

通过将 etcd 的 TLS 密钥交换算法从 RSA 升级为 ECDHE,可实现前向保密,彻底消除 “私钥泄露导致历史流量解密” 的风险。核心步骤是通过强制启用含ECDHE的套件,并禁用 RSA 密钥交换套件,同时建议升级到 TLS 1.2+ 并优化证书类型(优先 ECDSA)。这一配置符合云原生安全最佳实践,也是 Kubernetes 等依赖 etcd 的系统推荐的安全标准。生成临时密钥的具体步骤是什么?如何验证etcd是否已成功更新为ECDH密钥交换算法?配置临时密钥交换算法可能带来哪些性能影响。

xuebo1129927648的博客 1万+

LearnOpenGL学习(高级OpenGL - - 实例化,抗锯齿)

借助该变量,我们可以改变其位置,渲染方式等。从0开始,当渲染第43个实例时,该变量为42。索引一个包含100个偏移向量的uniform数组,将偏移值加到每个实例化的四边形上。)技术,用一个绘制函数让OpenGL绘制多个物体,而非循环(Drawcall: N->1)。,来节省每次绘制物体时CPU -> GPU的通信,它只需要一次即可。(Instance Count),它能够设置我们需要渲染的实例个数。对于在同一场景中使用相同顶点数据的对象(如草地中的草),可以使用。版本需要一个额外的参数,叫做。

zaizai1007的博客 855

YOLOv13改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv13-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 353

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LearnOpenGL——高级OpenGL(十一)抗锯齿

摘要 本文介绍了图形渲染中的锯齿边缘问题及其解决方案——抗锯齿技术。锯齿边缘(Jagged Edges)是由于光栅化过程中顶点数据转换为片段时采样不足导致的走样(Aliasing)现象。文章重点讲解了多重采样抗锯齿(MSAA)技术的工作原理:通过在每个像素中使用多个采样点来计算图元的覆盖情况,最终平均颜色值来获得更平滑的边缘效果。相比早期的超采样抗锯齿(SSAA),MSAA在保证效果的同时显著提升了性能。文章还详细说明了如何在OpenGL中启用MSAA,包括设置GLFW窗口参数和创建离屏渲染的多重采样缓冲附

QQ805009795的博客 693

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LearnOpenGL-高级OpenGL-11.抗锯齿

每个片段的颜色会由顶点数据插值而得出,得出的颜色存储在每个片段的中心 一个片段有4个采样点,这4个采样点的颜色都与片段中心的颜色一样 当一个片段的**4个**采样点被三角形包围,则片段的最终颜色是**四个**采样点颜色相加除以4 当一个片段有**两个**采样点被三角形包围,两个采样点在外面,则片段的最终颜色是会将**两个**采样点的颜色相加后除以4

qq_34060370的博客 777

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【实践LearnOpenGL项目】高级篇

本文介绍了OpenGL中的四项高级渲染技术:1. 实例化渲染技术,通过glDraw*Instanced实现3万个陨石的高效渲染,避免了循环绘制的性能损耗;2. 离屏抗锯齿技术,通过多重采样帧缓冲和后处理帧缓冲消除图形边缘锯齿;3. 统一缓冲对象(UBO)技术,用于在多个着色器间共享矩阵和光源参数;4. 几何着色器应用,演示了通过几何着色器实现三角形爆炸效果。每种技术都配有核心代码片段和实际效果图,展示了从基础渲染到高级优化的完整解决方案。

qq_37378423的博客 2218

LearnOpenGL 学习笔记 高级 OpenGL

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

hijackedbycsdn的博客 1241

LearnOpenGL笔记——四、高级OpenGL:“几何着色器”、“实例化”和“抗锯齿”

四、高级OpenGL:“几何着色器”、“实例化”和“抗锯齿” 4.9 几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点 几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换 然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点 废话不多说,我们直接先看一个几何着色器的例子:#version 330 core layout (points) in; la

weixin_44478658的博客 437

(自用)learnOpenGL学习总结-高级OpenGL-抗锯齿

光栅器会将一个图元的所有顶点作为输入,并将它转换为一系列的片段。顶点坐标理论上可以取任意值,但片段不行,因为它们受限于你窗口的分辨率。顶点坐标与片段之间几乎永远也不会有一对一的映射,所以光栅器必须以某种方式来决定每个顶点最终所在的片段/屏幕坐标。每个像素的中心包含有一个采样点(Sample Point),它会被用来决定这个三角形是否遮盖了某个像素。图中红色的采样点被三角形所遮盖,在每一个遮住的像素处都会生成一个片段。虽然三角形边缘的一些部分也遮住了某些屏幕像素,但是这些像素的采样点并没有被三角形。

SHIgaNatsuki的博客 430

learnopengl——Anti Aliasing

https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing somewhere in your adventurous rendering journey u probably came across some jagged saw-like (saw 锯) patterns along the edges of your models. the reason these jagged edges appear is due to how the raster

小孔明的专栏 322

LearnOpenGL 笔记(四)-高级OpenGL下

八、高级数据 缓冲函数 OpenGL中的缓冲只是一个管理特定内存块的对象,在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。 glBufferData函数:分配一块内存,并将数据添加到这块内存中,如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。4 glBufferSubData:我们可以提供一个偏移量,指定从何处开始填充这个缓冲.缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用glBuff

qq_41061477的博客 1300

LearnOpenGL-笔记-其九

我们可以看到,我们生成VBO之后,我们从指向模型变换矩阵的数组指针开始,我们需要单独取出每个子碎石的VAO来绑定庞大的模型变换矩阵数组,我们从layout=3的位置开始一行一行地读取,然后每一个实例都要更新一个实例ID,因为一个顶点数据的最大大小为vec4,所以我们需要四个顶点数据组成完整的mat4变量。小行星带,显然难的不是行星而是行星带比较难处理,当我们想象行星带时,我们很容易想到大量的碎石,显然这些碎石的数量远远大小我们的Uniform的数据大小上限(非常大的数量级)。

lastXuanGod的博客 1176

LearnOpenGL——高级OpenGL(下)

LearnOpenGL——高级OpenGL后半部分

qq_52179126的博客 1294

LearnOpenGL性能优化指南:实例化渲染与高级渲染技巧

LearnOpenGL是一个全面的OpenGL学习资源库,包含了从基础到高级的所有OpenGL章节代码实现。本指南将深入探讨如何通过实例化渲染技术和高级渲染技巧显著提升OpenGL应用程序的性能,让你的图形应用在保持视觉质量的同时运行得更加流畅。 ## 为什么性能优化对OpenGL应用至关重要 🚀 在实时图形应用中,性能优化直接影响用户体验。随着场景复杂度的增加(如大量3D模型、高分辨率纹理

gitblog_00898的博客 811
上一篇: LearnOpenGL学习笔记——实例化
下一篇: LearnOpenGL学习笔记——高级光照
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值