本系列的博文是笔者读《Unity Shader入门精要》的读书笔记,这本书的章节框架是:

第一章:着手准备。

第二章:GPU流水线。

第三章:Shader基本语法。

第四章:Shader数学基础。

第五章:利用简单的顶点/片元着色器来实现辅助技巧。

第六章:基本光照模型。

第七章:法线纹理、遮罩纹理等基础纹理。

第八章:透明度测试和透明度混合。

第九章:复杂光照实现。

第十章:高级纹理(立方体纹理等)。

第十一章:纹理动画、顶点动画。

第十二章:屏幕特效。

第十三章:深度纹理。

第十四章:非真实感的渲染算法。

第十五章:噪声在游戏渲染中的应用。

第十六章:优化技巧。

第十七章:表面着色器实现渲染。

第十八章:物理渲染技术。

第十九章:Unity5中的可能出现的问题。

第二十章:更深入的大门。

本书的主旨:原理+使用技巧。

第一篇的笔记:

第二篇到第四篇没有动手编程,都是理论知识。

第二篇《渲染流水线》的笔记:

1.渲染流水线是为了在屏幕上渲染二维图像;

2.渲染流水线的输入是虚拟摄像机、光源、shader和纹理;

3.渲染流程的三个阶段:应用阶段、几何阶段、光栅化阶段;

4.应用阶段是CPU负责实现的,开发者主导此阶段;

5.开发者在应用阶段下的任务有:a准备好场景如摄像机的位置和朝向、光源等,b粗粒度剔除工作,是为了将不可见的物体剔除,不让它们传到几何阶段,c设置好每一个模型的渲染状态如材质、纹理、shader等;

6.渲染图元包括点、线、三角面等需要被绘制的几何信息;

7.几何阶段在GPU上进行,它决定图元以何种方式绘制,在哪里绘制等,和每一个渲染图元打交道,输入的渲染图元经过多步处理后,输出屏幕空间中的而为顶点坐标、深度值、着色细节等信息;

8.光栅化阶段是为了利用上一个阶段产生的信息产生屏幕上的像素,渲染出最终图像的,在GPU上进行本阶段。对顶点的数据进行插值,得到最终的像素。

9.三个阶段都会有更加细的流水线划分;

10.CPU是渲染流水线的起点;

11.应用阶段a将数据加载到显存中,b设置渲染状态(也就是shader、纹理等),c调用drawcall;

12.渲染所需数据从硬盘HDD加载到内存RAM中,再被加载到显存VRAM中;

13.显卡对显存的访问更加快,比起对内存,更不用说比起HDD;

14.渲染状态规定了场景中的网格是如何被渲染的,例如使用了何种顶点着色器(VertexShader)片元着色器(FragmentShader)、光源属性和材质等;

15.CPU将渲染状态准备好后,通过调用DrawCall让GPU进行渲染,如果一直不改动此渲染状态,那么GPU将会一直以这个渲染状态来进行绘制;

16.DrawCall的调用不需要指定任何材质信息(原因上一点也说了),一次DrawCall命令针对一个图元Primitives的列表;

17.顶点数据由CPU加载到显存上去,然后DrawCall交由顶点着色器处理;

18.顶点着色器完全可编程,通常为顶点做空间变换,顶点着色等功能;

19.曲面细分着色器用于细分图元;

20.几何着色器用于逐图元着色,或者用于产生更多的图元;

21.裁剪将不再摄像机内的顶点裁掉,剔除某些三角形面;

22.屏幕映射将图元的坐标切换到屏幕坐标系下;

23.几何阶段的流水线为:顶点数据》顶点着色器》曲面细分着色器(可选)》几何着色器(可选)》裁剪》屏幕映射;

24.片元着色器可以编程,负责逐片元操作,逐片元操作为了执行颜色修改、深度缓冲、混合等,逐片元操作是可配置而不可编程的;

25.光栅化阶段的流水线是:三角形设置》三角形遍历》片元着色器》逐片元操作;

26.顶点着色器处理单元是顶点,每进来一个顶点就会调用一次顶点着色;

27.顶点着色器本身不知道顶点之间的拓扑关系,也不销毁或创建顶点;

28.顶点着色器能够并行处理顶点,因为顶点之间相互独立;

29.顶点着色器主要完成坐标变换和逐顶点光照计算;

30.顶点着色器必须要完成的一个工作:把顶点坐标从模型空间转换到齐次裁剪空间,这个空间是视野空间,这个空间也是为了做裁剪运算的,比如把不在(-1,-1,-1)到(1,1,1)里的点裁剪掉;

31.术语:归一化设备坐标NDC;

32.OpenGL和Unity的NDC中的z分量是-1到1的,而DX是0到1的;

33.在NDC单位立方体内进行裁剪时,在视野内的部分保留,因而可能产生新顶点,效果如下:

34.裁剪是硬件决定的,无法编程;

35.屏幕映射将图元的x和y转换到屏幕坐标系下,屏幕映射不处理z,z和映射后的xy合称窗口坐标系;

36.DX的屏幕坐标系原点在左上角(和UE一样),OpenGL的原点在左下角;

37.经过了几何阶段的屏幕映射的处理,将会传来关于顶点的额外信息如深度值,法线,视角方向等;

38.光栅化的两个重要目标:a图元覆盖了哪些像素,b计算这些像素的颜色;

39.三角形设置是为了计算三角形三条边处在哪些像素上的;

40.三角形遍历是为了计算某一个像素是否被一个三角形覆盖,如果是的话,这些像素称为“片元”fragment,这个遍历过程也称为扫描变换;注意片元和像素并不完全一致;

41.在所有的量上,比如深度、颜色等,为片元进行插值计算;

42.片元着色器接受三角形遍历得到的对顶点插值的结果,输出是一个或者多个颜色值;

43.片元着色器还能够完成重要的渲染技术如纹理采样;

44.真正对像素产生影响的阶段是逐片元操作;

45.逐片元操作PerFragmentOperations是OpenGL的说法,在DX中称为OutputMerger输出合并阶段;

46.逐片元操作a决定每个片元的可见性,如深度测试等,b将片元和已经储存在颜色缓冲区的颜色进行合并,或者说混合;

47.逐片元操作是可配置的;

48.逐片元操作的流程:片元》模板测试》深度测试》混合》颜色缓冲区;

49.模板测试是自定义的测试,当一个片元的某个指标值和缓冲区中的此指标值做比较,通过测试的话,就可以进入下一个测试,没有通过的话就被舍弃;不管有没有通过,都可以设置缓冲区中的指标值;

50.深度测试常常用来做前后遮挡的测试,如当前片元的深度比缓冲区中的深度小(靠近屏幕),那么它就通过测试,并有权利修改缓冲区中的深度指标;

51.通过了所有测试的进入混合操作,如果没有开启混合(也就是完全遮挡的),那么直接使用该片元的颜色,更新到缓冲区中的颜色值;如果开启了的话,将缓冲区和本片元的颜色做一个数学运算得到新值写入给缓冲区;

52.逐片元操作中的测试往往会被移到更加早的步骤上进行测试,为了节省计算;深度测试提早做,EarlyZ技术;

53.避免我们看到光栅化中的图像,将会进行双重缓冲,即当下一帧画面的内容准备好后,才登上屏幕;

54.OpenGL和DX是计算机图像的API,由APP调用,GL和DX则会去调用显卡驱动,显卡驱动真正去调用硬件设备;

55.SL着色语言是用来编写着色器代码的,从而避免写汇编语句,HLSL是DX的着色语言,GLSL是OpenGL的着色语言,CG(C for Graphic)是NVIDIA的着色语言;

56.UnityShader语言和CG、HLSL和GLSL不完全一样是着色器语言;

57.CPU和GPU是如何一起工作的?有一个命令缓冲队列,CPU向其中塞入命令如DrawCall或者改变渲染状态,而GPU则是从中获取命令并执行;

58.渲染速度往往快于提交命令的速度,也就是说CPU提交DrawCall数目太多将会导致效率低(复制10000个1kb文件和复制一个10M文件的比喻,即提交大量很小的DrawCall会导致效率低下);

59.如何减少DrawCall?尽量让一次DrawCall做很多活,也就是批处理思想;

60.固定函数流水线也称为固定管线,通常指在较旧的GPU上实现的渲染流水线;(只可以配置而不可以完全控制,就好像只能使用开关控制而不能修改布局的电路);注:管线是管道线的简称,也就是封闭的流水线,无法完全操控内部;

61.Shader是GPU流水线上一些课高度编程的阶段,最终代码在GPU上运行,有特定类型的着色器(顶点着色器、片元着色器),利用着色器控制流水线中的渲染细节如顶点着色器进行变换等;

Unity Shader入门精要读书笔记(一)序章的更多相关文章

  1. Unity Shader入门精要读书笔记(二)UnityShader概述

    第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...

  2. Unity Shader入门精要读书笔记(三)Shader必须的数学基础

    Xyz三维坐标系如下:左手坐标系 但是摄像机观察空间则是采用右手系: 右手法则判断叉乘的结果的方向: 正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性: 列矩阵运算CBAv和行矩阵的运算 ...

  3. Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

    转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...

  4. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  5. Unity Shader入门精要学习笔记 - 第15章 使用噪声

    转载自 冯乐乐的 <Unity Shader 入门精要> 消融效果 消融效果常见于游戏中的角色死亡.地图烧毁等效果.这这些效果中,消融往往从不同的区域开始,并向看似随机的方向扩张,最后整个 ...

  6. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  7. Unity Shader入门精要学习笔记 - 第11章 让画面动起来

    转自 冯乐乐的 <Unity Shader入门精要> Unity Shader 中的内置变量 动画效果往往都是把时间添加到一些变量的计算中,以便在时间变化时画面也可以随之变化.Unity ...

  8. Unity Shader入门精要学习笔记 - 第10章 高级纹理

    转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...

  9. Unity Shader入门精要学习笔记 - 第9章 更复杂的光照

    转载自 冯乐乐的<Unity Shader入门精要> Unity 的渲染路径 在Unity里,渲染路径决定了光照是如何应该到Unity Shader 中的.因此,如果要和光源打交道,我们需 ...

随机推荐

  1. Spring事务管理—aop:pointcut expression解析

    先来看看这个spring的配置文件的配置: <!-- 事务管理器 --> <bean id="transactionManager"  class="o ...

  2. XCOM2中敌对生物设计分析(ADVENT篇)

    最近,在制作游戏Demo--DroneAssmble的过程中,对于敌对生物的设计,参考了幽浮系列的相关设定,因此着手对幽浮2中的主要敌人进行分析. 我们知道, XCOM2中的敌对生物主要由" ...

  3. 单人纸牌_NOI导刊2011提高(04)

    单人纸牌 时间限制: 1 Sec  内存限制: 128 MB 题目描述 单人纸牌游戏,共 36 张牌分成 9 叠,每叠 4 张牌面向上.每次,游戏者可以从某两个不同的牌堆最顶上取出两张牌面相同的牌(如 ...

  4. PHP中递归最详解释.

    说到递归函数想必会有很多同学感到晕晕的,很难绕,容易绕错,那下面就让我来为大家详解一下. 首先,什么是递归函数呢? 1.所谓递归:指的是在函数内部,调用函数自身的操作.2.递归分两布:递(从最外层函数 ...

  5. 长沙JavaEE培训机构哪家比较靠谱?Java培训的职业前景

    长沙JavaEE培训机构哪家比较靠谱?可信度高? 全球信息化的时代已经到来,IT行业越来越受大众的欢迎,所以越来越多的人把注意力集中到IT职业教育培训.在软件开发领域,Java培训已经成为人们的首选, ...

  6. windows安装nvm管理node版本

    1.卸载原本系统里面的nodejs 2.下载nvm安装包:https://github.com/coreybutler/nvm-windows/releases ---->nvm-setup.z ...

  7. DOM 和 BOM 的 对象 和方法

    DOM   对象 有 documet  event element  attlibute 方法  getElementById   getElementsBytagname  getElementsB ...

  8. 【LeetCode】89. Gray Code

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  9. dashDB - Creating a table with CLOB column type

    In order to create a table with clob column type, the table has to be created with "ORGANIZE BY ...

  10. Java自学手记——servlet3.0新特性

    servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...