注:资料整理自《Unity Shader入门精要》一书

一、渲染流程概念阶段: 

应用阶段:(1)准备好场景数据:(如摄像机位置,物体以及光源等)

        (2)粗粒度剔除(Culling):(把不可见物体剔除,不导入下一阶段)

        (3)设置每个模型的渲染状态:(如材质、纹理、shader等),输出渲染图元(rendering primitives)(如点、线、三角面等几何信息)并传递至下一阶段

几何阶段:(1)在GPU上处理绘制几何所需要的相关操作(具体操作细分在随后的GPU流水线中介绍)

        (2)重要操作:把顶点坐标变换到屏幕空间中,再交给光栅器处理

        (3)随后输出屏幕空间的二维顶点坐标,每个顶点的深度值、着色信息等至下一阶段

光栅化阶段:(1)利用上一阶段的数据在屏幕上产生像素,并渲染出最终图像(由逐顶点数据  ->  到逐像素数据

注:这只是概念化的渲染阶段,具体硬件上的流程请参考下面的GPU流水线

二、GPU流水线: 

几何阶段

顶点着色器(Vertex Shader):完成的主要工作有:坐标变换和逐顶点光照

裁剪(Clipping):将不在摄像机范围内的物体剔除掉

屏幕映射(Screen Mapping):

    输入:上一阶段的单位立方体内的三维坐标

     输出:二维屏幕坐标系(Screen Coordinates),与分辨率有关

     保留Z轴坐标(深度值),与屏幕坐标系构成窗口坐标系(Window Coordinates)

光栅化阶段

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

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

    替这些像素计算颜色

百科:光栅化(Rasterization)是把顶点数据转换为片元的过程,具有将图转化为一个个栅格组成的图象的作用

三角形设置(Triangle Setup):

    计算光栅化一个三角网格所需的信息(如坐标信息等)

三角形遍历(Triangle Traversal)

    检查每个像素是否被三角形网格所覆盖,如果是,则生成一个片元(Fragment)

    通过三角网格来判断覆盖了哪些像素,并用3个顶点的顶点信息对这些像素插值

      注:片元并不相当于像素,相比于像素还多了很多信息(如坐标,深度值、法线、纹理坐标等)

片元着色器(Fragment Shader):

      输入:上一阶段的插值数据

         输出:颜色值(一个或多个)

逐片元操作(Per-Fragment Operations(OpenGL)):

       (Output-Merger(DirectX))

  主要任务:(1)决定每个片元的可见性

         (2)如果一个片元通过所有测试,则把这个片元的颜色值和已储存在颜色缓冲区中的颜色合并

  模范测试和深度测试是可配置的,通常将片元的模板值/深度值与开发者给定的值进行比较,然后决定是否舍弃该片元

  混合也是可配置的,决定是覆盖上一次颜色缓冲区中值还是进行合并(如透明效果)        

三、其余补充

关于Draw Call

首先DrawCall通俗讲就是CPU对GPU发出的一个命令(CPU调用图像编程的API(如OpenGL和DirectX)以命令GPU开始渲染

大致上的渲染阶段:CPU阶段:CPU从硬盘中加载数据到显存中 -> 设置好渲染状态 ->  DrawCall

                                GPU阶段:参考上文第二部分GPU流水线        

         

  众所周知,DrawCall会影响游戏的帧数,而帧数则是由CPU和GPU两者中较差的那个决定了瓶颈上限,因此当DrawCall多了以后,如上图2.19所示,CPU需要一条条发布命令,而GPU由于对图像的渲染能力很强,可以一次渲染多个三角网格,此时往往就会导致CPU处理速度跟不上无法及时给出命令,而GPU则会处于空闲状态。

那如何减少DrawCall?

  (1)避免使用大量很小的网格,如果必须使用时可以考虑把他们合并成一张大网格,减少节点数

  (2)避免使用过多的材质

UnityShader学习笔记1 — — 入门知识整理的更多相关文章

  1. AngularJs学习笔记1——入门知识

    1.什么是AngularJs          AngularJs 诞生于2009年,由Misko Hevery 等人创建,后被Google收购,是一个优秀的Js框架,用于SPA(single pag ...

  2. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  3. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  4. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  5. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  6. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  7. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  8. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  9. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

随机推荐

  1. SGU---104 DP

    题目链接: https://cn.vjudge.net/problem/SGU-104 题目大意: 假设你想以最美观的方式布置花店的橱窗,你有F束花,每束花的品种都不一样,同时,你至少有同样数量的花瓶 ...

  2. Sublime Text 3中文乱码

    Sublime Text 3是很好的代码编辑器,没有之一,因为她的性感高亮代码配色,更因为它的小巧,但是它默认不支持GBK的编码格式,因此打开GBK的代码文件,如果里面有中文的话,就会乱码,如下所示: ...

  3. 【从源代码看Android】02MessageQueue的epoll原型

    版权声明:本文为博主原创文章,欢迎转载.请注明原文链接 https://blog.csdn.net/ashqal/article/details/31772697 1 开头 上一讲讲到Looper,大 ...

  4. Golang格式化小结

    Golang的格式化使用了与c.python等语言类似的风格,但是更加丰富和通用.格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Printl ...

  5. Python - 格式化字符串的用法

    0. 摘要 Python支持多种格式化字符串的方法,包括%-fromatting.str.format().f-strings三种,f-strings是Python3.6以后出现的一种新方法,相比其他 ...

  6. C语言程序设计I—第十一周教学

    第十一周教学总结(12/11-17/11) 教学内容 第4章 循环结构-break continue嵌套循环 4.3 判断素数,4.4求1! + 2! + -. + 100! 课前准备 在蓝墨云班课发 ...

  7. Jmeter之post上传文件

    上周五东西都收拾好了,然后被叫住加班,直接搞到凌晨一两点,原因是另一个项目的性能出了点问题.为此我抓包写了一下主业务流的接口,涉及到文件上传,记录一下吧. 一.创建线程组,添加各类组件 这个就不用说了 ...

  8. 解决vue跨域axios异步通信

    在项目中,常常需要从后端获取数据内容.特别是在前后端分离的时候,前端进行了工程化部署,跨域请求成了一个前端必备的技能点.好在解决方案很多. 在vue中,在开发中,当前使用较多的是axios进行跨域请求 ...

  9. PHP SHA1withRSA加密生成签名及验签

    最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP的签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来. ...

  10. go lang中局部变量的内存分配

    晚上在阅读go lang的资料时突然想到一个问题,go是如何分配变量的内存结构的呢?好在网上的一篇文章做了透彻的分析见[go语言局部变量分配在栈还是堆]. 其结论是go语言局部变量的分配是由编译器决定 ...