unityShader入门精要 渲染流水线

应用阶段

  1. 把数据加载到显存中

  2. 设置渲染状态

  3. 调用Draw Call

几何阶段

顶点着色器

顶点着色器需要完成的工作主要有:

坐标变换和逐顶点光照

  • 坐标变换:就是对顶点的坐标进行某种变换。

一个最基本的顶点着色器必须完成的一个工作是,把顶点坐标从模型空间转换到齐次裁剪空间

接着通常由硬件做透视除法后,最终得到归一化设备坐标(NDC)。

裁剪

摄像机的视野范围不会覆盖所有的场景物体

那些不在摄像机视野范围的物体不需要被处理。

裁剪就是为这个目的而生的

我们已知在NDC下的顶点位置,即顶点位置在一个立方体内,因此裁剪只需要将图元裁剪到单位立方体内。

和顶点着色器不同,这一步是不可编程的,而是硬件上的固定操作,但我们可以自定义一个裁剪操作来对这个进一步进行配置。

屏幕映射

这一步输入的坐标依然是三维坐坐标系下的坐标。

任务:把每个图元的x和y坐标转换到屏幕坐标系下。

屏幕坐标系是一个二维坐标系,它和我们用于显示的分辨率有很大关系。

屏幕坐标系和z坐标一起构成了一个坐标系,叫做窗口坐标系

屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。


光栅化阶段


 

三角形设置

从上一阶段输出的信息是屏幕坐标系下的顶点位置以及和它们相关的而外信息。

光栅化阶段的两个最重要的目标:

计算每个图元覆盖了哪些像素

为这些像素计算他们的颜色


这个阶段会计算光栅化一个三角网格所需要的信息。

如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。

为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。

这样计算一个三角网格表示数据的过程就叫做三角形设置。

三角形遍历

也称扫描变换

该阶段会检查每个像素是否被一个三角网格所覆盖。

如果覆盖的话,就会生成一个片元

这一步的输出就是得到一个片元序列。

一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。

片元着色器

在DirectX中,片元着色器被称为像素着色器

此时的片元并不是一个真正意义上的像素

前面的光栅化阶段会产生一系列的数据细信息,用来表述一个三角网格是怎么样覆盖每个像素的。

而每个片元就是负责存储这样一系列数据。

真正会对像素产生影响的是逐片元操作

这一阶段可以完成很多重要的渲染技术,其中最重要的技术之一是纹理采样。

为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标了。

逐片元操作

逐片元操作是OpenGl中的说法。

在DirectX中,这一阶段被称为输出合并阶段。

这一阶段的任务:

  1. 决定每个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。

  2. 如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并。

逐片元操作阶段是高度可配置性的,即我们可以设置每一部的操作细节。


如果没有通过其中某一个测试,那么之前为了产生这个片元所做的所有工作都是白费的,因为这个片元会被舍弃掉。

模板测试

如果这个片元没有通过这个测试,该片元就会被舍弃。

不管一个片元有没有通过模板测试,我们都可以根据模板测试和下面的深度测试结果来修改模板缓冲区,这个修改操作是由开发者指定的。

深度测试

如果开启了深度测试,GPU会把该片元的深度值和已经存在与深度缓冲区中的深度值进行比较。这个比较函数是由开发者设置的。

如果这个片元没有通过深度测试,该片元就会被舍弃。

如果一个片元没有通过深度测试,他就没有权力更改深度缓冲区中的值。

如果通过了测试,开发者还可以指定是否要用这个片元的深度值覆盖掉原有的深度值,这是通过开启/关闭深度写入来做到的。

混合

开发者可以选择开启/关闭混合功能。

如果没有开启混合功能,就会直接使用片元的颜色覆盖掉颜色缓冲区中的颜色。

如果开启了混合,GPU会取出源颜色和目标颜色,将两种颜色进行混合。源颜色☞的是片元着色器得到的颜色值,而目标颜色则是已经存在颜色缓冲区中的颜色值。

之后,就会使用一个混合函数来进行混合操作。这个混合函数通常和透明通道息息相关,例如根据透明通道的值进行相加、相减、相乘等。


现代的GPU会判断片元着色器中的操作是否和提前测试发生冲突,如果由冲突,就会禁用提前测试。但是,这样也会造成性能上的下降,因为有更多片元需要被处理了。这也是透明度测试会导致性能下降的原因。

posted @   Apollonia  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示