4、计算机图形学——光栅化、抗锯齿、画家算法和深度缓冲算法(Z-buffer)

【图形学】抗锯齿方法总结 本文简单总结了常见的抗锯齿方法,包括以MSAA为主的超采样抗锯齿方法,和现在主流的后处理抗锯齿方法。 阅读详情
AI摘要

本文深入解析了光栅化的过程,介绍了三角形如何通过采样和叉积法判断是否在屏幕内,以及抗锯齿技术(SSAA和MSAA)原理。还探讨了画家算法和Z-buffer在表达深度关系中的作用,以及深度缓冲算法如何解决深度问题。

一、光栅化(Rasterization)

1.1、概念

光栅raster这个词就是德语中屏幕的意思,光栅化的意思就是将图像绘制在屏幕上进行显示。

1.2、三角形光栅化过程简述

首先,为什么要以三角形的光栅化为例呢,因为三角形是最基本的多边形,大部分的模型都是用一个个三角形表示,任意的其它多边形其实都可以转化成多个三角形的形式,因此以三角形的光栅化为例

如下图所示,给定了三个点,如何将得到的三角形绘制在右边的屏幕上?

首先需要进行采样,采样的意思就是对给定的函数进行离散化,比如上图中,要实现一个判断屏幕上的像素是否在三角形内的函数,然后将三角形顶点构成的最大长方形区域内所有点作为函数的输入,判断这些点是否在三角形内,如果在三角形内,就将屏幕上的像素点进行点亮。这个过程就是采样。其他采样的例子包括对视频进行时间上的采样,这样就可以得到视频中的某几帧画面

对函数进行采样之后,就知道了哪些点在三角形内,然后将对应的像素进行点亮就得到了要绘制的三角形

1.3、如何确定一个点是否在三角形内部

这里参考学习|判断一个点是否在三角形内 - 知乎 (zhihu.com)的同侧叉积法

首先,如何判断某两个点在某条直线的同一侧?

根据向量的叉乘以及右手定则,AB*AM (*表示叉乘)的方向为向外垂直屏幕,AB*AN也是向外垂直屏幕,但AB^AO的方向是向内垂直屏幕,因此MN在直线AB的同侧,MO在直线AB的两侧。

实际计算时,只需要考虑叉积的数值正负,向量的叉积的符号判别可以直接将向量写成行列式,然后求解行列式的正负得到向量的方向

假设各点坐标为A(0,0), B(4,0), M(1,2), N(3,4), O(3,-4), 则:

AB*AM = (4,0)*(1,2) = 4*2 - 0*1 = 8

AB*AN = (4,0)*(3,4) = 4*4 – 0*3 = 16

AB*AO = (4,0)*(3,-4) = 4*-4 – 0*3 = –16

因为数值的正负表示叉乘结果向量的方向。即,如果叉积AB*AM 和 AB*AN的结果同号,那么M,N两点就在直线的同侧,否则不在同一侧。

以上的问题解决了,就很容易的用来判断某个点是否在三角形内,如果P在三角形ABC内部,则满足以下三个条件:P,A在BC的同侧、P,B在AC的同侧、PC在AB的同侧。某一个不满足则表示P不在三角形内部。

1.4、显示

但是得到的三角形边缘变得不规则,产生了锯齿,和期望得到的三角形不一致,所以这就需要进行抗锯齿处理

二、抗锯齿

2.1、锯齿产生的原因

锯齿产生的原因就是因为信号的变化频率高,而相应的采样频率低。就三角形边缘不规则的情况来说,因为三角形的边上是无限多个点,而用有限个方块去逼近无限多个点的三角形的边,所以当然会产生不规则的锯齿,硬件的解决办法一是可以加大屏幕的分辨率,使得像素变小,从而可以得到更多个有限的方块去逼近三角形。而软件的方法就是加入抗锯齿算法。无论是硬件方法还是软件方法,都不能完全解决锯齿问题,只能缓解锯齿问题,直到人眼察觉不出来

2.2、软件上抗锯齿的方法及原理

1、SSAA(super sampling antialisa,超采样抗锯齿算法)

SSAA的思想就是将一个像素分解成2*2,3*3,4*4......,然后判断分解后像素中的4个或者9个或者16个像素点是否在三角形内,如果在像素内,就将点绘制成红色,然后将这4个或者9个或者16个像素点的像素值求平均值,最后作为整个像素点的像素值

以2*2为例,比如采样结果是这样的

然后将三角形周围的每个像素点一分为4,就会变成下面这样的

之后,分别计算每个大像素中四个小像素的像素平均值作为整个大像素的填充,最终,整体变成下面这样的

到此,SSAA算法结束

如前面所说,使用SSAA过后,锯齿依然会存在,只不过SSAA通过超采样的方式把原本是纯白色的像素绘制成了介于白色和红色之间的像素,从而使得图形边缘锯齿看起来不那么突兀,从而达到了抗锯齿的作用

效果对比如下

右边是使用了SSAA的结果,可以看到,锯齿不那么突兀了

2、MSAA(multi-sampling antialisa,多采样抗锯齿算法)

SSAA每次计算时,都要计算每个子采样像素的像素值,如果采样频率越高,则计算量越大,对此,MSAA出现了

MSAA的思想就是如果有子采样像素在三角形内,那么,就认为像素点需要着色,采样后,看有多少个子采样像素点在三角形内,然后计算在三角形内的子采样像素占所有采样点的比重,最后把整体的像素值(比如红色)乘以该比重,就得到了最终绘制的像素值。

比如下面这个像素被采样了四次

使用MSAA并不会计算四次子像素值,而是将红色的像素值*0.5,最终得到一个浅红色作为该整个像素的像素值,节约计算量,加快算法速度

光栅化并缓解了锯齿问题后,就可以将一系列的问题画到屏幕上,但是物体和物体之间的深度信息或者前后位置关系该如何表达?表达物体深度的方式有两种,一种是画家算法,另一种是z-buffer算法

三、画家算法

画家算法就是首先绘制距离较远的场景,然后用绘制距离较近的场景覆盖较远的部分。

画家算法首先将场景中的多边形根据深度进行排序,然后按照深度从大到小顺序进行描绘。

比如下面的场景,深度顺序背景、山、草地、数目,所以先绘制背景,再绘制山,然后绘制草地,最后绘制数目

画家算法通常会将不可见的部分覆盖,可以解决可见性问题。

但是在某些情况下,画家算法也会失效,比如下面这幅图,pqr三个图形彼此互相都有遮挡,无法对三个物体的深度进行排序。

此时,无法通过画家算法来显示物体之间的深度关系,因此,深度缓冲算法出现了

四、深度缓冲算法(Z-buffer)

因为在透视投影钟,可以得到每个像素的深度信息z,

深度缓冲的算法过程如下:

1.首先分配一个数组buffer,数组的大小为像素的个数,数据中的每个数据都表示深度,初始深度值为无穷大

2. 随后遍历每个三角形上的每个像素点[x,y],如果该像素点的深度值z<zbuffer[x,y]中的值,则更新zbuffer[x,y]值为该点深度值z,并更新该像素点[x,y]的颜色为该三角形上像素点上的颜色。

伪代码如下

示例

如上图,首先把屏幕上所有的像素点的深度都设置为无穷大,然后先绘制一个所有深度都为5、颜色为红色的三角形,因为5比无穷大小,所以,把三角形中所有的像素点都绘制到屏幕上,颜色为红色,深度更新为5,之后,又有一个紫色的三角形。其深度值各不相同,以深度为8的顶点为例,8>5,所以这点像素会被深度为5的像素遮挡,不做任何处理。再以深度为3的顶点为例,因为3>5,所以更新这点的像素颜色为紫色,深度为3。其余像素同理

z-buffer算法的好处就是不区分三角形绘制的先后顺序,只需要找到每个像素上深度值的最小的像素和颜色即可。

深度图的样子

深度图分为两种,一种是近处物体被描画为深色,而远处物体被描画为浅色,这是因为在透视投影时,将相机的朝向定为了Z轴正方向,那么在Z轴方向,离远点越远,像素值就越大。

而另一种如下图所示,在透视投影时,将相机的朝向定为了Z轴负方向,那么在Z轴方向,离远点越远,Z值越小,像素值就越小,所以越远深度图的颜色就越黑

参考:

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

Z-buffer算法 1、Z缓冲区(Z-Buffer)算法 1973年,犹他大学学生艾德·卡姆尔(Edwin Catmull)独 立开发出了能跟踪屏幕上每个像素深度的算法 Z-buffer Z-buffer让计算机生成复杂图形成为可能。Ed Catmull目 前担任迪士尼动画和皮克斯动画工作室的总裁 Z缓冲器算法也叫深度缓冲器算法,属于图像空间消隐算法 该算法有帧缓冲器和深度缓冲器。对应两个数组: in... 阅读详情

相关推荐

计算机图形学中的着色

计算机图形学中的着色1.画家算法深度缓冲(Z - Buffer)Z-Buffer实例深度缓冲的算法(Z - Buffer Algorithm) 1.画家算法 画家在画油画时,会从远景开始画起,然后逐渐画近景覆盖远景,比如下图: 参考画家算法,在屏幕空间中画一个正方体就需要如下的绘制步骤: 首先绘制最远的那个面(后面),然后再画左面和下面,之后再画上面和右面,最后画正面。就可以得到这样一个正方体。先画背面最后画正面可以理解,那么四个侧面的顺序是如何决定的?目前我们只是暂时用这种画法,没有什么特殊的决定方法

牵LV小猪精的博客 1087

入门图形学:抗锯齿

抗锯齿(anti-aliasing)这个名词我相信大家都听说过,特别是玩单机游戏挺常见的,如果你和我一样用的一张性能一般般的显卡(虽然我公司开发机是gtx1080,但我家里自用的gtx750ti),偶尔在家玩单机游戏的时候,那个“狗牙”(锯齿)可严重了。 先来说下锯齿如何产生的,锯齿嘛,顾名思义,想像一下链锯的锯条,图片如下: 那么为什么三维引擎中,...

羊羊的博客 6891

从GAMES101作业2的Z-Buffer出发:5分钟搞懂游戏里“谁挡谁”的底层逻辑(附MSAA反走样效果对比)

本文深入解析了计算机图形学中的Z-Buffer深度测试和MSAA反走样技术,从GAMES101作业2的实践出发,详细讲解了游戏画面中“谁挡谁”的底层逻辑及反锯齿效果的实现原理。通过代码示例和技术对比,帮助开发者理解并应用这些核心技术,提升游戏画面质量。

weixin_38167262的博客 384

计算机图形学(十一):真实感图形(画家算法消除隐藏面)

先将画面中的物体按其距离观察点的远近进行排序,结果存放在一张线形表中。距观察点远者称其优先级高,放在表头,距观察点近者称其优先级低,放在表尾,这张表称为深度优先级表。

乔卿的博客 4042

GAMES101图形学课程解析:从光栅化到光线追踪

计算机图形学是通过数学算法生成视觉内容的技术领域,其核心原理包括几何变换、光照模型和渲染管线。光栅化作为实时渲染的基础,通过三角形离散化和深度测试实现高效绘制,而光线追踪则基于物理光学模拟真实光照效果。GAMES101课程系统性地讲解了从BRDF推导到蒙特卡洛积分等关键技术,结合工业级案例如NVIDIA实时光追和MSAA抗锯齿,帮助学习者深入理解图形学底层原理。该课程特别适合希望掌握GPU渲染管线优化、理解现代游戏引擎技术的开发者,其数学可视化教学方法能有效降低学习曲线。

weixin_26841743的博客 229

三角形光栅化的艺术:采样理论与工业实践的二重奏

本文深入探讨了三角形光栅化的核心理论与工业实践,重点分析了采样理论在计算机图形学中的应用及抗锯齿技术(如SSAA和MSAA)的实现。通过傅里叶分析揭示走样现象的本质,并介绍现代GPU硬件优化技术,帮助开发者提升渲染质量与性能。

weixin_29309213的博客 642

【计算机图形学】【GAMES101学习笔记】Rasterization 光栅化

光栅化是对象顺序图形的中心操作,而光栅化器是任何图形管道的中心。对于输入的每个基元,光栅化器有两个任务:枚举基元覆盖的像素,并在基元上插值,称为属性。这些属性的用途将在后面的示例中明确。光栅化器的输出是一组片段,每个片段对应于基本体覆盖的像素。每个片段“存在”于特定像素处,并携带其自己的一组属性值。...

charenCsdn的博客 1万+

别光看笔记了!用C++和OpenGL手撸GAMES101作业,图形学才算真入门

本文详细介绍了如何通过C++和OpenGL实践GAMES101课程中的计算机图形学核心算法,包括环境搭建、变换矩阵实现、光栅化与Z-Buffer算法等。通过手把手教程,帮助读者从理论走向实践,真正掌握图形学编程技巧,适合计算机图形学入门学习者和GAMES101课程作业实践者。

weixin_30932215的博客 295

msaa 遍历_计算机图形学四:抗锯齿SSAA及MSAA算法和遮挡剔除Z-Buffer算法

抗锯齿算法和Z-Buffer算法在通过上一节的讲解之后,我们已经能够成功的把带有几何意义的顶点信息从虚拟3维世界之中转换到用像素表示的2维屏幕之中,那这样真的已经足够了吗?本节我们看看还有哪些问题需要进一步解决。1 锯齿 (走样,Aliasing)利用上一节的三角形光栅化算法之后,我们可以把该三角形表示成一个如下图所示的像素点集合 对!发现问题了没有? 三角形变的“歪歪扭扭”的,哪能说它是一个标...

weixin_39961943的博客 699

C++软渲染器实战:从零实现3D图形渲染管线与光栅化

3D图形渲染是计算机图形学的核心领域,其本质是将三维场景通过一系列数学变换与算法转换为二维图像。其基本原理涉及坐标系统、矩阵变换和投影几何,通过模型-视图-投影矩阵将物体从三维空间映射到屏幕。在技术实现上,光栅化是关键步骤,它将几何图元转换为像素,并借助深度缓冲解决遮挡关系。从工程实践角度看,手动实现软渲染器能深刻理解GPU底层工作流程,掌握顶点处理、三角形遍历和片段着色等关键技术环节。本文基于C++和现代开发环境,通过构建数学库、模拟图形管线并实现漫反射光照,具体演示了如何从零开发一个完整的软渲染器,尤其

banshen0201的博客 374

OpenGL固定管线深度解析:从顶点处理到双缓冲的执行流拆解

图形流水线是计算机图形学的核心执行模型,指从三维几何数据经变换、裁剪、光栅化到最终像素输出的完整处理链。其本质是一套严格时序约束的状态机,每个阶段(如顶点处理、Z-buffer测试、双缓冲交换)均有明确的数据输入/输出契约与不可逆操作边界。理解流水线的关键在于掌握矩阵堆栈机制、NDC标准化意义、片元与像素的本质区别,以及深度测试、面剔除、抗锯齿等关键技术的底层原理。本文聚焦OpenGL 1.x固定管线,以山东大学图形学期末考题为线索,系统梳理经典五级流水线中各模块的执行逻辑与常见误区,特别强化gluLook

weixin_35006125的博客 92

Game101现代计算机图形学入门学习笔记(四)

变换(模型、视图、投影)1、视图变换什么是视图变换如何表示视图变换数学中的MviewM_{view}Mview​总结2、投影变换1、计算机图形学中的投影变换2、正交投影3、透视投影7、参考 1、视图变换 什么是视图变换 如何拍照 找到一个好地方并安排好人的站位(模型变换 model transformation) 找到一个好的角度取放置相机(视图变换 view transformation) 拍照(投影变换 projection transformation) 如何表示视图变换 数学中的MviewM

Genius_J的博客 861

计算机图形学流水线原理与OpenGL实践解析

计算机图形学核心在于理解GPU如何将三维几何数据转化为二维像素图像,其本质是空间坐标系的逐级变换与缓冲管理。从建模坐标系出发,经模型变换、视图变换和投影变换构成MVP矩阵,再通过透视除法实现深度感知;光栅化阶段完成顶点属性插值,片元着色器决定最终像素颜色;双缓冲机制则通过前后帧解耦与垂直同步保障显示一致性。这些原理不仅支撑OpenGL渲染流程,也广泛应用于嵌入式DMA传输、DDS波形生成等实时图形系统。本文结合山大数媒课程真题,深入剖析MVP矩阵构造、gluLookAt推导及glfwSwapBuffers底

weixin_42613017的博客 193

计算机图形学:光栅化

图形渲染管线的核心是将三维模型的顶点坐标逐步转换为屏幕坐标,主要包括以下五个阶段。模型最初位于模型空间(Object Space),顶点坐标描述模型自身的局部位置。变换公式:相机通常由三个向量定义:位置 e、视线方向 g 和参考上方向 t。根据这些向量构造视图矩阵 M_view,将相机位置移动到原点,并使相机视线对齐负 Z 轴、上方向对齐正 Y 轴。视图矩阵:其中,T_view 负责平移,R_view 负责旋转。

2401_88966792的博客 336

OMNET++ INET框架学习教程(一)

在自组网学习的道路上摸石头过河,帮你快速入门OIMNET++平台下的INET框架。

NLDwangzhe的博客 6556

ISE 14.7 MCS文件的生成--- Spartan3AN XC3S200AN

步骤一: Generate Programming File生成 .bit文件 步骤二: Tools——>iMPCAT 步骤三: iMPACT Flows——>双击“Create PROM File(PROM File Formatter)” 步骤四: Non-Volatile FPGA——>点击”Spartan 3AN“——>点击“绿色箭头”——>Spartan3AN(bits)——>选择“xc3s200an"——>点击”Add storage Device“—

qq_40039676的博客 2098

Rust-Sloth源码深度剖析:几何变换、光栅化算法与缓冲区管理的完整指南

Rust-sloth是一个独特的命令行3D软件光栅化渲染器,专为终端环境设计。这个开源项目展示了如何在有限的计算资源下实现实时3D渲染,是学习计算机图形学和Rust编程的绝佳示例。本文将深入剖析rust-sloth的核心实现,重点关注几何变换、光栅化算法和缓冲区管理三大关键技术。 ## 🎯 项目概述与核心功能 Rust-sloth是一个基于Rust语言的3D软件渲染器,能够在终端中实时渲染3

gitblog_00583的博客 400

C# OpenCvSharp4实战:5分钟搞定工业视觉模板匹配(附完整代码)

本文为C#开发者提供了基于OpenCvSharp4的工业视觉模板匹配实战指南。通过详细的环境搭建、核心原理解析和完整代码示例,重点介绍了如何使用`matchTemplate`函数,特别是`CCoeffNormed`方法,快速实现高精度、抗光照变化的模板匹配,并分享了多目标匹配、图像预处理等工业级优化技巧。

weixin_29053067的博客 500

计算机图形学 着色(shader) 学习笔记

r是离光源的半径,离光源越远,Ld(光源的强度)值越小,由于n, l为单位向量,n与l的点集就为n的模乘以l的模乘以cos,则角度越小,接触的通光量则越少,则光亮度越弱,由于不考虑光线折射,cos角度大于180的场景(大于180°后点集值为负),所以做了一个max(0, n ^ l)的操作。画家算法:从远到近的光栅化,近的物体的着色覆盖远的物体的着色,近的物体的RGB优先。小正方形内的数字代表距离相机的远近程度,越近的就将远的像素信息给覆盖掉。实际计算机图形学使用的是Z-Buffer深度缓冲。

qqQQqsadfj的博客 1081

机器学习(三) ----------线性回归算法(梯度下降+正则化)

线性回归算法在机器学习中具有核心地位,它以其简单性和直观性为基础,为理解数据间的关系提供了基本框架。作为许多复杂算法的基础,线性回归不仅用于预测目标变量,还用于解释自变量对目标的影响。同时,它也是机器学习入门的经典算法,对于推广机器学习知识和技术具有重要意义。

2301_77539454的博客 1865

多智能体强化学习MASAC算法:从原理到PyTorch实战详解

深度强化学习通过智能体与环境的交互试错来学习最优策略,是解决复杂序列决策问题的核心技术。其核心原理在于利用价值函数或策略梯度来最大化累积奖励,在机器人控制、游戏AI等领域展现出巨大技术价值。当面对多个智能体需要协同或竞争的复杂动态环境时,单智能体算法因环境非平稳性而面临挑战,多智能体强化学习应运而生。Multi-Agent Soft Actor-Critic (MASAC) 算法融合了SAC的稳定高效与中心化训练去中心化执行的范式,通过维护中心化Critic网络和独立策略网络,有效解决了多智能体协作中的信用

weixin_30080745的博客 326

【Notes_4】现代图形学入门——光栅化、离散化三角形、深度测试与抗锯齿

光栅化 Viewport Transform(视口变换) 将经过MVP变换后得到的单位空间模型变换到屏幕上,屏幕左边是左下角为原点。 所以视口变换的矩阵 Mviewport=(width200width20height20height200100001)M_{viewport}=\begin{pmatrix} \frac{width}{2}&0&0&\frac{width}{2}\\ 0& \frac{height}{2}&0&\frac{height}{2

weixin_44794443的博客 525

基于Python的全卷积网络(FCN)实现路径损耗预测

本文提出一种基于全卷积网络(FCN)的无线信道路径损耗预测方法。通过合成数据生成模块构建包含房间布局和发射点坐标的训练数据集,采用双分支FCN架构融合空间特征与坐标信息,引入空间注意力机制增强关键区域提取。实验表明,该方法相比传统模型能更准确地预测复杂环境下的路径损耗,平均绝对误差降低约35%。系统支持端到端训练,可扩展融合多模态数据,为5G网络规划等应用提供高效预测工具。

huanghm88的专栏 576

GAMES101复习:光栅化

图形学复习

最不正经的计算机专业学生 621

[Dify实战] 品牌舆情速览:多渠道抓取、聚类情绪、生成日报-带绑定资源

摘要: 品牌舆情监测面临多渠道信息分散、手工处理效率低的痛点。Dify舆情速览助手通过自动化流程(数据抓取→情绪聚类→日报生成)帮助快速识别热点与风险。方案核心包括: 结构化处理:按情绪(正/中/负)聚类,分级标注风险事件; 日报输出:含热点摘要、趋势分析及处置建议(动作+团队+时间窗口); 质量控制:数据去噪、黑名单过滤,结合人工复核确保合规性。 落地需明确数据源分级(如权威媒体优先)、设置情绪阈值,并建立"发现-响应-复盘"闭环机制,提升舆情应对效率。 (字数:150)

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 297

TMC2240 芯片数据手册解读|第十三篇 StallGuard4负载测量(StallGuard4 Load Measurement)

摘要: TMC2240的StallGuard4技术专为StealthChop2静音模式设计,通过SG4_RESULT实时测量电机负载,实现堵转检测、无传感器回零和CoolStep节能。其核心原理基于负载角检测,通过SG4_THRS阈值调节灵敏度,并支持四通道独立测量(SG4_IND_0~3)优化相位平衡。独特功能包括无抖动模式切换补偿(sg_angle_offset),解决StealthChop2与SpreadCycle切换时的电流突变问题。调优时需结合SG4_THRS设定与DIAG验证,确保堵转精准触发。

BackCatK Chen的博客 300
上一篇: 3、计算机图形学——模型视图变换、投影变换与视口变换
下一篇: 5、计算机图形学——着色与光照模型
Master Cui
博客等级 码龄9年 1408粉丝 224原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值