UnityShader——05几何阶段和光栅化阶段

这篇具有很好参考价值的文章主要介绍了UnityShader——05几何阶段和光栅化阶段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

几何阶段和光栅化阶段

GPU流水线

几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU,GPU通过实现流水线化,大大加快了渲染进度。虽然无法完全控制着两个阶段的实现细节,但GPU向开发者开放了很多控制权

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

  • 顶点数据为输入,顶点数据是由应用阶段加载到显存中,再由Draw Call指定的。这些数据随后被传递给顶点着色器。
  • 顶点着色器是完全可编程的,它通常用于实现顶点的空间变换,顶点着色器等功能。曲面细分着色器是一个可选着色器,用于细分图元。几何着色器同样是可选着色器,可以被用于执行逐图元的着色操作,或者被产生于更多的图元。裁剪,这一阶段的目的是将那些不在摄像机视野内的顶点裁剪掉,剔除某些三角图元的面片。这个阶段可配置。屏幕映射,这一阶段不可配置和编程,负责把每个图元的坐标转换到屏幕坐标系中。
  • 光栅化概念阶段中的三角形设置三角形遍历都是固定函数的阶段。片元着色器则是完全可编程的,用于实现逐片元的着色操作。逐片元操作阶段负责很多重要操作,如修改颜色,深度缓冲,进行混合等,不可编程,但是可配置。

几何阶段详解

顶点着色器

  • 顶点着色器的处理单位是顶点,也就是说,输入进来的每个顶点都会调用一次顶点着色器。顶点着色器本身不可以创建或者销毁任何顶点,而且无法得到顶点与顶点直接的关系。GPU可以利用本身的特性快速处理每一个顶点。
  • 顶点着色器主要完成的工作:坐标变换及逐顶点光照。当然,除此之外还可以输出后续阶段所需的数据等。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

裁剪

  • 一个图元与摄像机的关系有3种:完全在视野内,部分在视野内,完全在视野外。完全在视野内的图元就继续传递给下一个流水线阶段,完全在视野外的图元不会继续向下传递。那些部分在视野内的需要进行裁剪

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

屏幕映射

  • 屏幕映射的任务是将裁剪后的齐次坐标(NDC)转换到屏幕坐标系,屏幕坐标系是一个二维坐标系,和用于显示画面的分辨率有很大关系。
  • 屏幕映射如下图示例,将齐次坐标下**-1,1的坐标范围转换到( x 1 x_1 x1, y 1 y_1 y1),( x 2 , y 2 x_2,y_2 x2,y2)。可以看到这个过程实际上就是一个缩放的过程。在这个处理中z轴不做处理。屏幕坐标系和z**轴构成了窗口坐标系。这些值会被传到光栅化阶段。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

光栅化阶段详解

三角形设置

这个阶段会计算光栅化一个三角网格所需要的信息。上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。如果要得到正规三角网格对像素的覆盖情况,就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,就需要得到三角形边界的表示方式

三角形遍历

  • 三角形遍历阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖的情况下,就会产生一个片元。而这样一个找到那些像素被三角网格覆盖的过程就叫做三角形遍历,也被称作扫描变换
  • 三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

片元着色器

片元着色器的输入是上一个阶段对顶点信息插值得到的结果,具体来说是根据那些从顶点着色器中输出的数据插值得到的。而其输出是一个或者多个颜色值。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

这一阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到起覆盖的片元的纹理坐标

逐片元操作

逐片元操作OpenGL中的说法,在DX中这个阶段被称作输出合并阶段*。

  • 决定每个片元的可见性,涉及很多测试工作,例如深度测试,模板测试。
  • 如果一个片元通过了所有测试后,就需要把这个片元的颜色值和已经储存在颜色缓冲区的色彩进行合并,或者说混合。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

测试的过程实际上是个比较复杂的过程,而且不同的图形接口(OpenGL和DX)的实现细节也不尽相同。

模板测试

模板测试,与之相关的是模板缓冲(Stencil Buffer)。模板缓冲和颜色缓冲,深度缓冲几乎是一类东西。如果开启了模板测试,Gpu首先读取(使用读取掩码)模板缓冲区中该片元位置的模板值,然后将该值和读取(使用读取掩码)到的参考值进行比较,这个比较函数可以由开发者指定的,例如小于等于舍弃该片元,或者大于等于舍弃该片元。如果这个片元没有通过测试,该片元就会被舍弃。不管一个片元有没有通过模板测试,我们都可以根据模板测试和之后的深度测试结果来修改模板缓冲区,这个操作也是由开发者指定的。模板测试通常用于限制渲染区域,或者渲染阴影,轮廓渲染等。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

深度测试

如果开启了深度测试Gpu会把该片元的深度值和已经存在于深度缓冲中的深度值进行比较。这个比较函数也是可由开发者设置的,例如小于时舍弃该片元,或者大于时舍弃该片元。通常这个比较函数是小于等于,即如果这个片元的深度大于等于当前深度缓冲区中的值,那么就舍弃它。这是因为我们总想只显示出离摄像机最近的物体,而那些被其他物体遮挡的就不需要出现在屏幕上。和模板测试不同的是,如果一个片元没有通过深度测试,它就没有权利更改深度缓冲区的值。如果一个片元通过了测试,那么开发者可以指定是否要用这个片元的深度值覆盖所有的深度值。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

合并混合

  • 合并 ,渲染过程是一个物体接着一个物体画到屏幕上,而每个像素的颜色信息被储存在一个名为颜色缓冲的地方。因此,当我们执行这次渲染时,颜色缓冲中往往已经有了上次渲染之后的颜色结果,那么,我们使用这次渲染得到的颜色完全覆盖掉之前的结果还是进行其他处理,就是合并需要解决的。
  • 对于不透明物体,开发者可以关闭混合(Blend)操作。这样片元着色器计算得到的颜色值就会之间覆盖掉颜色缓冲区中的像素值。但对于半透明物体,就需要混合操作来让这个物体看起来是透明的。

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity

各种测试总结

  • 各种测试的顺序并不是唯一的,虽然从逻辑上来说这些测试是在片元着色器之后进行的,但对于大多数GPU来说,会尽可能在执行片元着色器之前进行这些测试。因为当你在片元着色器进行了大量的计算及设置,最后测试没通过,可以说是计算成本全都浪费了。作为一个想充分提高速度的GPU,肯定是希望尽可能早的指定哪些片元会被舍弃,对这些片元就不再需要在使用片元着色器来计算他们的颜色。Unity的渲染流水中,深度测试就是在片元着色器之前。
  • 但是,如果将这些测试提前的话,其检验结果可能会与片元着色器中的一些操作冲突。例如片元着色器在进行透明度测试,而这个片元没有通过透明度测试,我们会在着色器中调用API(clip)函数来手动将其舍弃。这就导致GPU无法提前执行各种测试。因此,如果片元着色器中的操作和提前测试发生冲突就会禁用提前测试。这样性能上就会下降,也是透明度测试导致性能下降的原因。
  • 当模型图元经过层层计算及测试后,就会显示到屏幕上。我们的屏幕显示的就是颜色缓冲区中的颜色值。但是,为了避免我们看到正在光栅化的图元,GPU会使用双重缓冲策略。对场景的渲染是发生在幕后的,即在后置缓冲中,一旦场景已经被渲染到后置缓冲中,GPU就会交换后置缓冲区和前置缓冲的内容,前置缓冲区就是显示在屏幕上的图像。由此,保证我们看到的图像是连续的。

注意:这里的流水线名,顺序,在不同资料上看到可能是不一样的。一个原因是由于图像编程接口的实现不尽相同,另一个是GPU底层可能做一些优化等等。

附加知识

CPU与GPU如何并行工作?

  • 之前看到的是一个流水线式的模式,如果需要CPU和GPU并行工作,就需要使用命令缓冲区(Command Buffer)。
  • 命令缓冲区包含了一个缓冲队列,由Cpu向其中添加命令,而由Gpu从中读取命令,添加和读取过程是相互独立的。命令缓冲区使得Cpu和Gpu可以相互独立工作。当Gpu需要渲染一些对象时,它就可以从命令队列中取出一个命令并执行。
  • 命令缓冲区有很多种类,Draw Call就是一种。其他命令还有改变渲染状态等

UnityShader——05几何阶段和光栅化阶段,UnityShader,unity文章来源地址https://www.toymoban.com/news/detail-828390.html

什么是固定管线渲染

  • 固定函数的流水线(Fixed-Function Pipeline),简称固定管线,通常是指在较旧的Gpu上实现的渲染流水线。这种流水线只给开发者提供一些配置操作,但开发者没有对流水线阶段的完全控制权。
  • 在Unity中目前的固定管线shader都会自动编译顶点片元shader。

什么是Shader

  • Gpu流水线上一些可高度编程的阶段,而由着色器编译出来的最终代码是会在Gpu上运行的;
  • 有一些特定类型的着色器,如顶点着色器,片元着色器等。
    色器等。
  • 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换及传递数据,用片元着色器来进行逐像素渲染。

到了这里,关于UnityShader——05几何阶段和光栅化阶段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Threejs学习05——球缓冲几何体背景贴图和环境贴图

    这是一个非常简单基础的threejs的学习应用!本节主要学习的是球面缓冲几何体的贴图部分,这里有环境贴图以及背景贴图,这样可以有一种身临其境的效果!这里环境贴图用的是一个.hdr的文件,可以在网上随便下载一些使用,我在这里的例子里面使用的hdr文件已经免费上传

    2024年02月11日
    浏览(30)
  • UnityShader入门学习(三)——Unity的Shader

    Tags Tags可以写在SubShader的一开始(所有的Pass用),也可以写在Pass块的内部(该Pass用) 渲染设置 同Tags一样也可以写在Pass中或者写在Pass外面(SubShader一开始) Pass介绍 Pass里面可以定义Pass名称 Pass里面的Tags还可以有额外的设置 还有CG语言所写的代码,主要是顶点片元着色器,

    2024年02月16日
    浏览(43)
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解

    在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。 对惹,这里有一 个游戏开发交流小组 ,希望大家可以点击进来一起交流一下开发经验呀 首先,我们来了解一下Dra

    2024年02月21日
    浏览(38)
  • 【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 一个物体为什么看起来是红色的?从物理上解释是因为这个物体

    2024年03月22日
    浏览(52)
  • 【UnityShader入门精要学习笔记】第三章(1)Unity Shader介绍

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 从本章节开始我们要学习Shader相关的知识了,诸位看客可能有的

    2024年02月02日
    浏览(71)
  • 【UnityShader入门精要学习笔记】第六章(2)在Unity中实现光照模型

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 在标准光照模型中国,环境光和自发光的计算是最简单的。而在

    2024年03月28日
    浏览(52)
  • 【UnityShader入门精要学习笔记】第三章(2)Unity Shader的形式,章节答疑

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年02月02日
    浏览(53)
  • unity学习笔记----游戏练习05

    一、阳光的收集和搜集动画开发 1.收集阳光的思路:当鼠标点击到阳光的时候,就可以进行收集了。可以通过为添加一个碰撞器来检测Circle Collider 2D 编写脚本: 在SunManager中写一个增加阳光的方法     //增加阳光     public void AddSubSun(int Point)     {         sunPoint += Point;  

    2024年02月20日
    浏览(35)
  • 05_Unity动态加载图片资源

    本文归纳了Unity中加载图片资源的常用方法,包括url和本地路径的加载。 在工具类中封装如下方法: 一般是放在单例中,如:GameManager 创建一个Image物体 在本地存放一张图片,Guide1.png 放置在: Resources/Image/Guide1.png 路径下 在物体上挂接一个测试脚本 执行前: 执行后: 还是刚

    2024年02月05日
    浏览(116)
  • 2023-05-29 Unity 2进制5——Excel配置表工具

    IExcelDataReader :从流中读取 Excel 数据 DataSet :数据集合类,存储 Excel 数据 DataTable :数据表类,表示 Excel 文件中的一个表 DataRow :数据行类,表示某张表中的一行数据 添加 Unity 菜单栏按钮 通过 Unity 提供的 MenuItem 特性在菜单栏添加选项按钮 特性名: MenuItem 命名空间: Uni

    2024年02月07日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包