光栅化的工作原理?计算机图形系列-03期
光栅化图形管线Game艺视界原创 15429 0
实名

通过了实名认证的内容创造者

发布于 2022-3-21 21:08:35

您需要 登录 才可以下载或查看,没有账号?注册

x

bc1e32f804421db6416a1508543961ff.png

大家好,今天我们将讨论图形管线
这将是我的计算机图形学系列中时长最少的数学视频,但它将把所有东西连接在一起。图形管线接收一些资源并输出一个渲染目标。这些资源是组成3d模型和纹理的三角形。输出是最终渲染的移动设备,所以问题是要做什么图形管线,用于将这些三角形和纹理转换为渲染模型,并且有多个不同的阶段。

8002a5daec5b411adf798f9df6631841.png


但现在我想重点关注事实行为

其中一些是蓝色的,其中一些是绿色的,蓝色的是固定的功能阶段,这意味着我们可以 设置一些参数来定义它们的但这就是我们对它们的所有控制,绿色的都在世界着色器中结束,着色器是一个我们可以编写的小程序。自己编写并在显卡上运行的小程序 既然我们可以编写代码来定义这些阶段,我们就可以很好地 控制它们的作用

让我们开始讨论输入汇编器

它的输入是一个顶点缓冲区,其中包含构成 3d 模型的每个三角形的所有顶点属性问题是因为所有这些数据都在一 大块内存中,我们无法区分各个属性,因此我们必须告诉输入汇编程序哪些属性构成了一个顶点

例如对于这个顶点缓冲区,我们有一个位置,一个UV坐标和一些法线这些数据是不够的,尽管我们还必须指定构成定义这些属性的向量的分量,例如位置是一个三维向量UV坐标是一个二维向量,在正常情况下是一个三维向量你可能是认为,指定构成单个属性的组件数量是多余的, 但是在位置的情况下,您也可以使用二维坐标或者在法线的情况下,

您可以使用极坐标将其打包利用这些信息将其分为两部分,我们现在可以区分顶点缓冲区中的各个属性问题是计算机需要更多信息, 因为它将以十进制形式存储数字,就像我在这里写的那样, 而是将它们存储为二进制数

这意味着它必须知道在这种情况下,必须使用哪种格式将它们转换回十进制数组件可以再次存储在32位的浮点数中

这是一个对我们来说并不重要的实现细节, 输入汇编程序还可以分配额外的顶点属性, 例如 30 X ID,它从0开始并递增到然而,有许多顶点 ID占用一个组件,并存储为一个无符号整数大约 16 位

我们顶点缓冲区中的每一行现在代表一个单一版本,tex 和顶点缓冲区中的每个单个顶点

现在将传递到下一个阶段,即顶点着色器

顶点着色器接收单个顶点的所有属性,并输出一组新的属性来执行此操作

它将使用一些外部数据,例如矩阵(Matrix),我们将在以后的视频中详细讨论这些数据

但现在您需要知道的是, 我们可以将位置乘以矩阵来转换位置,这样当位置进入顶点着色器时,它就会出来作为一个不同的向量,一个由矩阵转换的向量

顶点着色器也可以只传递属性而不修改它们,例如UV坐标通常只会被传递

或者它也可以引入新的属性,例如每个顶点处的颜色属性,着色器输出的位置应该在负1和1之间的范围内, 这意味着退出顶点着色器的每个顶点都以 t 为 2 的立方体结束

对于正在观看这些视频的程序员来说,我刚刚描述的顶点着色器的代码

管线中的下一个阶段 是曲面细分阶段它是整个着色器的组合名称,tesa和主着色器

曲面细分阶段采用一个基元,例如这个Square,它输出一个更详细的输入版本,换句话说,输出包含更多的三角形 tessellation 是一个相当高级的主题,所以我不会在这里简要介绍它,尽管它的工作方式是整个着色器定义输出三角形的模式, 然后 tesa 将根据模式创建这些三角形, 然后域着色器将根据某些公式定位三角形

细分的潜在用例正在采用低多边形模型和通过引入更多三角形来表现高多边形模型

图形管线的下一阶段是几何着色器,它在整个图元中采用是一个三角形,此外它还可以接收该三角形的相邻顶点并输出其输入的修改版本

例如它可以只输出其输入,但它也可以引入一个 新顶点,然后将这个三角形变成金字塔 进入几何着色器的图元不必是三角形,它们也可以是几何着色器


现在可以采用该线并将其扩展为两个三角形的线,这在我们想要建模头发时很有用,例如我们可以将头发定义为一条线,但由于一条线没有表面,我们需要一个几何着色器来创建该表面

我们可以进入几何着色器的最后一个基元是一个点,几何着色器可以获取该点并将其变成一个球场,例如对于粒子系统很有用,现在离开这些已经到达他们的最终位置

这次绘制它们,由光栅化器完成

我将放置一个像素网格和它接受每一个三角形,例如这个蓝色三角形,然后它必须将该三角形转换成一堆像素,现在看起来像这样 ,你拥有的像素越多,三角形的近似值就越好,

让我们看看如果这是相机,我们刚刚渲染的接缝那么相机显然看到了一个蓝色三角形,现在如果蓝色三角形后面还有一个红色三角形,问题是我们已经光栅化了蓝色三角形,

所以如果我们现在也光栅化红色三角形 然后它会出现在蓝色三角形的前面
这当然是错误的,不幸的是我们无法通过改变绘制三角形的顺序来解决这个问题, 因为这在显卡上是不可能的

我们的问题的解决方案也是使用我们称为深度缓冲区的第二个图像或设置缓冲区 制作此图像。方式是将三角形表面的 Z 坐标转换为离表面越近的颜色。如果三角形对相机来说颜色越深,换句话说三角形的左下角最接近相机

如果我们现在光栅化红色三角形,那么只有蓝色后面的部分三角形将变得可见并注意我们还将红色三角形的设置值写入深度缓冲区,我们稍后会回到您如何以及为什么这样做。现在让我们专注于我们的三角形只有一个单色如果我们想将纹理应用于该三角形,例如,光栅化器是一个阶段,它在三角形表面上插入顶点属性, 并且对于它生成的三角形的每个像素,它会将属性传递到像素着色器

这是计算颜色的阶段,

正如我刚才所说的,像素着色器接收单个像素的所有属性并输出它,可以基于我们讨论过的纹理和采样器执行的颜色,我强烈建议你去看最后一个视频,对于程序员来说,这里有一段代码,它根据 UV 坐标分配颜色纹理和采样器

我们图形管线的最后阶段

它在颜色和深度中的输出合并单个像素的信息,另外它还接受深度缓冲区值和同一像素的渲染目标颜色输出合并的输出,通常与其输入颜色相同但它也可以执行混合,在其输入颜色之间混合以及渲染目标中已经存在的颜色

例如,如果输入像素的深度值小于深度缓冲区中已有的值,则可以给出这种粉红色,然后输出合并会将颜色写入渲染目标,并且更新深度缓冲区中的值

但是如果输出合并输入的深度值大于深度缓冲区中已有的值,则输出合并不会将该颜色写入渲染目标并保持颜色不变。这个原则是使红色三角形出现在蓝色三角形后面的原因

内容以原视频教程为主


https://www.youtube.com/c/FloatyMonkey/videos



本帖被以下画板推荐:

微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表