shader之渲染流水线
demi 在 周一, 06/03/2019 - 13:48 提交
【渲染流程】应用阶段:该阶段由CPU负责实现。开发者有三个主要任务:准备场景数据、 粗粒度剔除(将不可见的物体剔除出去)、设置每个模型的渲染状态(即渲染图元) ;几何阶段 :这阶段在GPU上进行,负责与每个渲染图元打交道,进行逐顶点,逐多边形的操作。该阶段重要任务是将顶点坐标变换到屏幕空间去,再交给光栅器进行处理。该阶段会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息。
【渲染流程】应用阶段:该阶段由CPU负责实现。开发者有三个主要任务:准备场景数据、 粗粒度剔除(将不可见的物体剔除出去)、设置每个模型的渲染状态(即渲染图元) ;几何阶段 :这阶段在GPU上进行,负责与每个渲染图元打交道,进行逐顶点,逐多边形的操作。该阶段重要任务是将顶点坐标变换到屏幕空间去,再交给光栅器进行处理。该阶段会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息。
Opaque:用于渲染所有不透明的物体;Cutout:作用:用于渲染有镂空的物体;Transparent:用于渲染有透明效果的物体;Fade:用于渲染实现物体的渐隐和渐现。
lightmode为forwardbase、forawardadd的pass内,_WorldSpaceLightPos0只会含有pixel光源,在forwardbase pass内,只有场景中存在rendermode为important的pixel平行光时,才会含有有效的_WorldSpaceLightPos0和_LightColor0的组合......
一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。本文将列举一系列贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。
前向渲染是通过深度缓冲和颜色缓冲来实现的,使用深度缓冲来决定一个片元是否可见,如果可见,则更新颜色缓冲区中的颜色值。如果场景中有n个物体受m个光源的影响,那么要渲染整个场景,则需要n*m个pass,如果m较多的话,这个开销还是比较大的。
表面遮挡住光源路径就会产生阴影,由理想点光源产生的阴影边缘是比较锐利的,而现实世界中的阴影边缘确是模糊的,该模糊部分成为半影。半影的出现,是由于现实世界的点光源不是空间意义上的一个点,它会覆盖一定的面积,就会产生以不同角度掠过物体边缘的光线。
在unity中主要有两种透明效果的实现,透明度测试和透明度混合,透明度测试比较简单暴力,就是对片元的alpha通道的值进行测试,满足条件就留下该片元,不满足就抛弃该片元,所以在本章中主要讨论第二种---透明度混合。
我们必须要明白我们是如何看到一个物体的,我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色,所以最终的颜色要由光源的颜色以及物体的颜色来共同决定。
Unity 表面着色器为开发者提供了一层简单快速的编写 Shader 的方式,对开发者来说隐藏了光照模型这些复杂的的概念,但是有时候 Unity 自带的光照模型往往不能满足我们的需求,而需要自己定义光照模型。所以接下来就一起看看 Unity 中常见的光照模型函数。
Frame Buffer 是用来存储帧位图的数据存储区域。这里在介绍另外一个缓存,叫深度缓存 (Depth Buffer), 也叫作 Z-Buffer。从名字上来看这是一个存储深度(数据)的存储区。深度是什么?要描述一个物体的位置,需要借助参照物。我们这里扩展一下, 要用数值来表述一个物体的某种属性,要有这个数值参照的原点。既然深度值是数值,那它的参照原点是什么呢?