Unity Shader学习4——光栅阶段

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://linsh-tech.blog.csdn.net/article/details/51395924

前言:

        在之前的文章中,我们补充了图像绘制管线的三个阶段:应用程序阶段、几何阶段和光栅阶段,其中几何阶段和光栅阶段使我们理解绘制过程的重点,在这里我们需要着重分析一下这两个过程。


光栅阶段

、难点解决:

        光栅化(Resterization),决定哪些像素被几何图元覆盖的过程。在之前的几何阶段完成后,我们得到了每个点的屏幕坐标值,也知道了需要绘制的图元(点、线、面)。但是,在实现光栅化之前,我们需要先解决两个重要的问题:

1.点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确定屏幕坐标值所对应的像素?

解决方案:绘制的位置只能接近两指定端点间的实际线段位置(就近原则,取整法
                 例如,一条线段的位置是(10.48,20.51) ,转换为像素位置则是(10,21)。


2.在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的2 个像素点绘制一条线段,如果根据已经确定了位置的 3 个像素点绘制一个三角形面片?

解决方案:要解决这个问题,设计到了画线算法区域图元的填充算法,例如:

                 画线算法:DDA算法、Bresenham画线算法

                 区域图元填充算法:扫描线多边形填充算法、边界填充算法等。


二、像素处理(Pixel Operation):

        解决了上述两个问题,我们的顶点(Vertex)以及绘制图元(线、面)已经对应到像素(Pixel)。那么,接下来我们就需要进行像素处理——给像素设置颜色值。

        Pixel Operation也称为Raster Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的就是:计算出每个像素的颜色值。在这个操作过程中,被遮挡面通过一个被称为深度测试的过程剔除掉。那么,Pixel Operation所包含的所有步骤有:

1.消除遮挡面:通过深度检测剔除;


2.纹理操作(Texture Operation):根据像素的纹理坐标,查询对应的纹理值;


3.混色(Blending):根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha),混合为两种颜色,做新的颜色输出,常称为alpha混合技术。每个像素固有的属性:RGB颜色值、Z缓冲器深度值和alpha(透明度)值。


4.过滤(Filtering):将当前正在计算的颜色值,通过某种Filtering(滤波或者滤镜)后输出,简单的解释就是对当前计算的颜色值进行一次数学运算得到新的颜色值


三、后续步骤:

        完成了光栅化之后的颜色值,会被写入到帧缓存中。关于像素的操作流程,我们可以参考下图:

   


四、常见的缓存区:

1.Z Buffer和Z值:

        有称为depth buffer,即深度缓冲区,用于存放视点到每个像素对应的空间点的距离权衡之,称为Z值或者深度值。Z值范围为【0,1】,最近的为0.0,最远的为1.0。通过z buffer可以判断空间点的遮挡关系,例如深度缓冲区算法就是对投影平面上每个像素所对应的Z值进行比较;


2.Stencil Buffer:模板缓冲区,是一个额外的buffer,用来“做记号”的buffer,通常附加到z buffer,每个像素对应一个stencil buffer。Z buffer和Stencil buffer通常在显存中共享一片区域;


3.Frame Buffer:帧缓冲器,用于存放显示输出的数据,这个buffer中的数据一般是像素颜色值。


五、其他:

        绘制管线资料推荐: Blinn 的《 A Trip Down the Graphics Pineline 》

展开阅读全文

没有更多推荐了,返回首页