OpenGL抗锯齿优化及部分函数说明

Anti-Aliasing

抗锯齿是图形学中的一个重要概念,它指的是消除或减少图像中的锯齿现象,也就是边缘不平滑的现象。锯齿现象会影响图像的质量和真实感,所以在游戏或视频中,通常会使用一些抗锯齿算法来提高画面的美观度。

抗锯齿算法有很多种,其中比较常见的有FXAA、SMAA、MSAA、TAA等。这些算法各有优缺点,适用于不同的场景和需求。本文将主要介绍两种抗锯齿算法:TAA和FXAA,并比较它们的区别。

一、多重采样抗锯齿(MSAA)
多重采样抗锯齿(MultiSampling Anti-Aliasing,简称MSAA),这是一种在OpenGL中的特殊的超级采样抗锯齿(SSAA),MSAA主要是对 Z-Buffer 和 Stencil Buffer(模板缓冲)进行SSAA处理,其原理是通过提取像素界面周围的颜色信息,通过混合颜色信息来消除高对比界面所产生的锯齿。只对多边形的边缘进行抗锯齿处理。
缺点:
资源耗费,画质上有些不如一般的SSAA。
OpenGL Extension Multsample
二、快速近似抗锯齿(FXAA)
快速近似抗锯齿(Fast Approximately -Aliasing,简称FXAA),是一种典型的边缘检查取样操作。FXAA原理与MSAA相同,其原理是通过提取像素界面周围的颜色信息,通过混合颜色信息来消除高对比界面所产生的锯齿。但是,FXAA将像素的提取和混合过程交由GPU 内的ALU(arithmetic and logic unit,算术逻辑单元)执行,所占用的显存带宽会 << 传统的MSAA。
优缺点
消耗低,速度快;但是是一种粗糙的模糊处理。

FXAA Shader

三、子像素增强抗锯齿(SMAA)
子像素增强抗锯齿(Enhanced Subpixel Morphological,简称SMAA),SMAA 与 FXAA类似,性能消耗小,但是相比FXAA更清晰。SMAA是后处理抗锯齿技术的一种,它的基本处理流程建立在Jimenez优化改造后的MLAA(形态学抗锯齿)算法之上。原始的MLAA是由英特尔实验室提出的抗锯齿技术,这项技术代表着后处理式抗锯齿蓬勃发展的开端。最初,MLAA是为CPU设计的,Jimenez对其进行改造并移植到GPU上,使其适用于实时渲染。SMAA则是在此基础上进一步发展而来的。
缺点
动态画面时,锯齿抖动厉害。
smaa参考文献

四、覆盖采样抗锯齿(CSAA)
覆盖采样抗锯齿(Coverage Sampling Anti-Aliasing,简称CSAA),这是一种覆盖的采样,它的原理是将边缘多边形里需要采样的子像素坐标覆盖掉,抒原像素坐标强制安置在硬件和驱动程序预告算好的坐标中。这就好比采样标准统一的MSAA,能够最高效率地执行边缘采样,交通提升非常明显,同时资源占用也比较低。
相比MSAA减少了带宽和存储开销。

五、时间性抗锯齿(TXAA)
让电影画质的游戏体验达到逼真水平。TXAA 抗锯齿比 MSAA和FXAA 以及 CSAA 的画质更高,制作CG电影的电影制片厂会在抗锯齿方面花费大量的计算资源,从而可确保观众不会因不逼真的锯齿状线条而分心。如果想要让游戏接近这种级别的保真度,那么开发商需要全新的抗锯齿技术,不但要减少锯齿状的线条,而且要减少锯齿状闪烁情形,同时还不降低性能。为了便于开发商实现这种保真度的提升,英伟达设计了画质更高的抗锯齿模式,名为TXAA.该模式专为直接集成到游戏引擎中而设计。

与CG电影中所采用的技术类似,TXAA集MSAA的强大功能与复杂的解析滤镜于一身,可呈现出更加平滑的图像效果,远远超越了所有同类技术。此外,TXAA还能够对帧之间的整个场景进行抖动采样,以减少闪烁情形,闪烁情形在技术上又称作时间性锯齿。

目前,TXAA有两种模式:TXAA 2X和TXAA 4X。TXAA 2X可提供堪比8X MSAA的视觉保真度,然而所需性能却与2X MSAA相类似;TXAA 4X的图像保真度胜过8XMSAA,所需性能仅仅与4X MSAA相当。

API

glBlendFunc

有两个参数,前者表示源因子,后者表示目标因子。
源因子 作用于源颜色(即即将要绘制的颜色或纹理值)
目标因子 作用于目标颜色(即之前所有绘制的颜色或纹理值结果)

glReadPixels 输出渲染结果

bin格式输出

              
               char* pixels=new char[1600*2000*4];
               glReadPixels(0, 0, 1600, 2000, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
               FILE* outfile=fopen( "./img.bin","wb");
               fwrite(pixels, 1600 * 2000 *4, 1,outfile);
               fclose(outfile);

cvMat输出

glPixelStorei(GL_PACK_ALIGNMENT, 4);
cv::Mat rgba(2000, 1600, CV_8UC4);
glReadPixels(0, 0, 1600, 2000, GL_RGBA, GL_UNSIGNED_BYTE, rgba.data);
{        
cv::imwrite("./img.png", rgba);
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值