十分钟分享:web3d-抗锯齿

为什么会出现

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

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

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

图来自网络

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

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

一系列处理方案

ssaa

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

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

缺点:高性能消耗

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

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

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

后处理

fxaa

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

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

smaa

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

优点:性能也不错

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

相关推荐
终端鹿2 分钟前
setup 语法糖从 0 到 1 实战教程
前端·javascript·vue.js
周淳APP2 分钟前
【React Fiber架构+React18知识点+浏览器原生帧流程和React阶段流程相串】
前端·javascript·react.js·架构
reasonsummer4 分钟前
【白板类-01-01】20260326水果连连看01(html+希沃白板)
前端·html
HelloReader5 分钟前
Qt Quick 视觉元素、交互与自定义组件(七)
前端
We་ct7 分钟前
LeetCode 153. 旋转排序数组找最小值:二分最优思路
前端·算法·leetcode·typescript·二分·数组
程序员阿峰10 分钟前
前端3D·Three.js一学就会系列:第二 画线
前端·three.js
HelloReader11 分钟前
Qt Quick Controls 控件库、样式与布局(八)
前端
兔司基11 分钟前
Node.js/Express 实现 AI 流式输出 (SSE) 踩的坑:为什么客户端会“瞬间断开连接”?
前端
yuki_uix13 分钟前
一次 CR 引发的思考:我的 rules.ts 构想,究竟属于哪种开发哲学?
前端·ai编程
可视之道25 分钟前
前端大屏适配方案:rem、vw/vh、scale 到底选哪个?
前端