十分钟分享:web3d-抗锯齿

为什么会出现

这里我们就不得不说一下webgl的光栅化的工作了。试想一下我们怎么去在纸上绘制一个3d物体,我们是不是只需要绘制我们人眼能看到的部位,并且因为每个物体都有自己的颜色,所以我们绘制完轮廓时还需要给物体上色。

但是手绘和在屏幕中上色有一些不同,因为屏幕之所以能够展示是因为它的无数个小像素点。

举个例子:我们能在屏幕上看到一个红色三角形,是因为在屏幕当前处于三角形区域的像素当前展示的为红色,如下图

图来自网络

仔细观察上图,我们发现像素点由一个个矩形组成,它是绘制时的最小单元。上图中其实只是理想状态,实际的光栅化过程中,在三角形边缘处的像素点(如果按照简单的包含关系着色)都会被染成红色。

那么此时体现在视觉上,就出现了锯齿感

一系列处理方案

ssaa

在渲染时,采用更高的分辨率。

举个例子:你的屏幕分辨率是1920x1080,而你采用了一种2x2的SSAA技术来渲染图像。这意味着实际渲染的分辨率将是3840x2160。在这种情况下,原本屏幕上的一个像素现在对应着4个渲染像素「"超采样像素"」(2个宽度方向上的,2个高度方向上的)。在渲染过程中,每个超采样像素都会被单独计算,包括它的颜色、亮度等信息。然后,在图像最终被输出到屏幕之前,相关的超采样像素会被合并(通常是取平均值或其他形式的过滤)到一个"普通"的屏幕像素中。这个合并过程会考虑所有相应的超采样像素,从而生成一个在视觉上更加平滑、减少锯齿的图像。

缺点:高性能消耗

msaa(webgl渲染器可自动开始)

这个技术其实是对ssaa性能方面的改进,可以说ssaa是将渲染区内的所有像素都进行了更细粒度的划分而mass仅是细分处与边缘处的像素点

缺点:需要硬件支持(不过大多数设置支持),同时还具有一定的局限性

后处理

fxaa

fxaa通过分析像素之间的亮度差来检测边缘,并对这些边缘进行平滑处理。它使用一种特殊的算法来模糊锐利边缘,从而减少锯齿。

优点:算法消耗成本低故此方法性能不错

smaa

smaa使用更复杂的模式和技术来识别图像中的边缘,包括对色差和亮度差的分析。它利用子像素级别的信息来更精确地检测和处理边缘。它通过对边缘周围的像素进行智能处理,包括重建锐利的角点和线条,从而提高了图像质量。

优点:性能也不错

还有需要:csaa、eqaa、txaa等可以自己去了解

相关推荐
慧一居士9 分钟前
flex 布局完整功能介绍和示例演示
前端
DoraBigHead11 分钟前
小哆啦解题记——两数失踪事件
前端·算法·面试
一斤代码6 小时前
vue3 下载图片(标签内容可转图)
前端·javascript·vue
中微子6 小时前
React Router 源码深度剖析解决面试中的深层次问题
前端·react.js
光影少年6 小时前
从前端转go开发的学习路线
前端·学习·golang
中微子6 小时前
React Router 面试指南:从基础到实战
前端·react.js·前端框架
3Katrina6 小时前
深入理解 useLayoutEffect:解决 UI "闪烁"问题的利器
前端·javascript·面试
前端_学习之路7 小时前
React--Fiber 架构
前端·react.js·架构
伍哥的传说7 小时前
React 实现五子棋人机对战小游戏
前端·javascript·react.js·前端框架·node.js·ecmascript·js
qq_424409198 小时前
uniapp的app项目,某个页面长时间无操作,返回首页
前端·vue.js·uni-app