计算机图形中的混叠效果_面向导航应用的一种新型抗混叠技术

处理器/DSP

891人已加入

描述

本篇文章主要向大家介绍GRLAA(GRadient Line Anti-Aliasing,梯度线抗混叠)技术,这种缩写是一种相对简单且高效的用来区分别名的方法,而且经常会在汽车导航应用中见到。

在信号处理的准则中,存在一个特定的采样频率称为奈奎斯特频率 ,当我们对某个信号的采样频率低于奈奎斯特频率时,那么从采样点恢复恢复出的信号是与原始信号不同的。原始信号与重构信号体现出的差别,这个效果成为“混叠”。

这里我们将与大家讨论在计算机图形中混叠效果最普遍的两种体现。第一种就是锯齿(如图1所示),主要就是在斜直线的方向上呈现锯齿状的阶梯。这是在显卡光栅渲染阶段像素之间产生的。

图1:抗混叠效果对比(左:禁止,右:允许)

第二个是采样混叠。当较高频率(快速变化)的纹理用于渲染远景的一些对象时,比如图2所示的棋盘模式,我们能够清晰的看到一些混叠效果,称为云纹图案模式。

图2:纹理混叠:双线性滤波(左)和三线性滤波-MIP贴图(右)

目前有多种算法能够降低这些可见的混叠现象,甚至消除锯齿效果。然而这些算法会占用相当一部分的系统性能,当然这与你使用的硬件平台也有关系。

·超级采样抗混叠(SSAA)技术:这是一种比较“暴力”的方式,首先以较高的分别率(最终所期望的整数倍x2、x4)来渲染整个场景,然后对整个帧缓冲区进行采样最终生成我们需要的最终分辨率。最终效果显示这种方法在质量上有保证,而且优化了锯齿和纹理采样,但是这个技术的实现成本代价很大。渲染的代价——包括光栅渲染、分片渲染以及相应的带宽——一般都是分辨率的平方,比如x2 SSAA对应的代价就是x4,x4 SSAA对应的代价就是x16。

·多采样抗混叠(MSAA)技术:这个方法会增加每个像素点的采样数量,将渲染的图像添加到缓冲区,并且能够存储每个像素点的多个采样值。然后通过缓冲区输出符合我们所期望的图像分辨率。这种技术在PowerVR硬件平台上非常高效而且全部是在芯片内部解决,节省了内存带宽。MSAA能够优化锯齿但是对于采样效果无能为力。

· 基于着色器(Shader)技术如快速近似抗混叠(FXAA)或亚像素形态抗混叠(SMAA),这两种方式都是采用分析来检测和模糊锐利的几何特性。同时也会在显示环节采用后处理算法,付出的代价一般都是固定的(单个全屏幕通过)但是会需要更大的存储带宽,显然这对于移动和嵌入式设备来讲是非常宝贵的。

梯度线抗混叠技术简介

Gerry Raptis是PowerVR SDK开发团队的主管,是他开发的GRLAA技术来改进我们正在设计的导航应用演示Demo。

GRLAA技术大幅度提升了道路几何图形边沿的可视化质量,所需要的计算成本也相对较低。除此以外这使得没必要再添加道路轮廓了。轮廓能够提升道路边沿的可视化程度,方便用户识别,更加清楚的区分道路边界。

图3:抗混叠道路图形轮廓

这个方法背后的一般想法就是渲染道路的不透明区,然后逐渐提升透明度,即在道路几何图形的上面或者边缘提升像素的百分比。

任何分片的alpha通道都是基于两个值。第一个是分片区与道路边沿的距离,第二个是这个距离的变化率,即我们常说的梯度,或者更正式的来说就是距离的偏导数。

每个分片的RGB颜色数值是通过计算(0,0,0)三者之间的差值来确定的,生成一个固定的黑色轮廓(或者其他颜色的轮廓)和道路的平面颜色,然后将统一数据传递给分片的着色器。所有这些计算都是基于差值t,这个值时通过相对距离和变化率来计算确定的。后面的内容会更加详细的介绍如何推算这些数值,以及这些数值对GRLAA技术的重要性。

这个算法目前的形式可能没有太大的价值,只适用于一些具有已知宽度的几何图形,比如一条路或者一条线等。

GRLAA技术详细分析

为了确定正确的融合水平,这个算法需要知道距离道路边沿的距离,因为这会影响融合的强度。这意味着数据集中每个几何顶点需要附加额外的顶点补偿数据,必须是某个两个常量值之一,即-1或1。这个赋值应该在奇数和偶数之间变换,这表示道路的一侧会接收基础值-1而另一侧则对应基础值1。这些数据会作为几何顶点数据上传给图形卡硬件,经过分片着色器计算才能确定最终的alpha通道值。

给每个顶点赋值的基础值按道路的两侧来分是不同的,比如左手侧和右手侧。因为这些顶点数据会被分片着色器用于计算,它们自动会被硬件进行插值转换。

图4:代表几何的基础属性值

插值转换后的基础值会用于计算当前分片与道路边沿的距离。比如道路中心的分片相对于道路的两边都是最远的,意味着相对距离如果是1,那么就能够有效的接收不需要融合。随着分片距离道路边沿越来越近,相对距离会接近到0,随之需要接收更多的融合。

float distance = 1.0 – abs(roadBaseVal);

既然我们已经确定了道路边沿相对道路宽度的相对距离,那么我们就需要确定渲染的道路轮廓的宽度。算法的第二大部分主要涉及需要渲染的分片百分比。

顶点数据的基础插值作为标准的GLSL偏导(梯度)函数的参数。函数“dFdX”和“dFdY”一般分别用来计算给定值在X方向和Y方向上的变化率,而且通常由一个小型网格(2x2)的分片来确定的。

计算过程能够输出当前分片距道路边沿相对距离的变化速率,根据当前分片与相邻分片的偏导数来推算。基于指定分片的变化率我们能够计算出合适的alpha通道值。最终结果则决定了分片的百分比,即定义了道路的边沿,此外为了绘制一个平滑的轮廓,我们还需要处理更多个分片。

#define ANTIALIAS_STRENGTH 2. // Constant affects how much AA will be applied, a higher value //will increase blurring at the cost of reduced detail, while a lower value will reduce the //amount of blurring at the cost of more aliasing.

float blend_range = ANTIALIAS_STRENGTH * sqrt(dFdx(roadBaseVal) * dFdx(roadBaseVal) + dFdy(roadBaseVal) * dFdy(roadBaseVal));

float blend_halfrng = 0.5 * blend_range;

变化率非常的重要,只有它才能够让算法不必考虑显示屏幕上道路的规模和尺寸。使用偏导数函数能够确定某对象所占用屏幕空间的百分比,比如下面的情况:

· 如果对象占用屏幕空间比较小(缩放),那么占用的像素点需要进行融合渲染来实现比较光滑的边沿效果,等同于占用较大百分比的屏幕像素空间。这是因为变化率比较大,基值是通过少量分片插值变换得出的。因此需要开始渲染距离道路边沿较远的分片,这时就可能出现锯齿。

· 相反,如果对象占用屏幕空间比较大(放大),那么占用的像素点需要通过融合渲染来降低占用的总像素数的百分比。这时变化率会比较低,基值的差值转换会涉及到更多的分片。因此就需要开始融合渲染距离道路边沿比较近的分片。如果结果比需要的百分比大,那么道路就会变得模糊。

图5:变化率,缩小vs放大

所有组件确定后就可以计算分片的最终颜色值,通过在轮廓颜色(这里主要是黑色)阈值和道路颜色(统一标准)阈值之前进行插值变换,我们才能够计算出RGB组件的属性值,插值变换是从相对距离和变化率衍生而来的。同时alpha组件的值也是通过相似的方式来计算,但是不需要进行插值转换。

#define OUTLINE_WIDTH 0.25 //How large our outline will be relative to the road width

float outline_distance = clamp(((distance – OUTLINE_WIDTH – blend_halfrng) / blend_range) + 0.5, 0.0, 1.0);

float blend_distance = clamp(((distance – blend_halfrng) / blend_range) + 0.5, 0.0, 1.0);

oColour.rgb = mix(vec3(0.0, 0.0, 0.0), roadColour.rgb, outline_distance);

oColour.a = blend_distance;

相比之前基于纹理抗混叠方法,GRLAA最主要的优势就是mip-map不需要任何依赖。基于纹理的方法会在抗混叠像素的数量上有一定的限制,尤其当几何图形被最小化后,因此我们采用基于mip-map的图形技术,本篇文章介绍的算法在处理任何尺寸的几何图形时都不会有问题,能够输出非常清晰高质量的抗混叠效果的边缘轮廓,而且不受对象尺寸和方向的限制。

第二个优势就是这个算法不需要任何的纹理资源,这样就会降低整体的存储带宽。这绝对是一个好消息,因为释放的一些存储带宽可以用于其他功能,尤其占用较多纹理资源的技术。

最后,就循环计算操作来讲这个算法的代价相对还是比较小的,因此不会明显增加计算负担。我们经过测量发现执行所有的着色器大概需要20个操作循环。此外根据你所采用的图像卡核心,设置中等精确度会进一步降低循环操作。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分