《ShaderLib入门精要》读书笔记

  《精要》买来已经一段时间了,一直很震撼读者小小的年纪就已经把Shader研究得这么透彻,还出了书帮助其他人学懂。然后去作者的博客,又发现了一番新的天地。
  还是记一下书中比较重要的地方吧。
  
  三角形遍历阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖的话,就会生成一个片元。
  片元着色器可以访问到导数信息。
  现代的GPU会判断片元着色器中的操作是否和提前测试发生冲突,如果有冲突,就会禁用提前测试。但是,这样也会造成性能上的下降,因为有更多片元需要被处理了,这也是透明度测试会导致性能下降的原因。

  在游戏开发中,为了减少DrawCall的开销,有两点需要注意:
  (1)避免使用大量很小的网格。当不可避免地需要使用很小的网格结构时,考虑是否可以合并使用它们。
  (2)避免使用过多的材质。尽量在不同的网格之间共用同一个材质。

  由于Unity内部会把所有Pass的名称转换成大写字母的表示,因此,在使用UseShader命令的时候必须使用大写形式的名字。
  事实上,FallBack还会影响阴影的投射,在渲染纹理阴影时,Unity会在每个Unity Shader中寻找一个阴影投射的Pass。
  和表面着色器类似,顶点/片元着色器的代码也需要定义在CGPROGAM和ENDCG之间,但不同的是,顶点/片元着色器是写在Pass语义块内,而非SubShader的。

  在Unity5.2中,所有固定函数着色器都会在背后被Unity变异成对应的顶点/片元着色器,因此真正意义上的固定函数着色器已经不存在了。

  使用SV_POSITION来描述顶点着色器输出的顶点位置。一些Shader使用了POSITION语义,但这些Shader无法再索尼PS4平台上正常工作。
  使用SV_Target来描述片元着色器的输出颜色。一些Shader使用了COLOR或者COLOR0语义,同样的,这些Shader无法在索尼PS4上正常工作。

  大体来说,在最坏的情况下,我们花在一个分支语句的时间相当于运行了所有分支语句的时间。

  每一个光源有5个属性:位置,方向,角度,颜色,强度,以及衰减。

  使用GrabPass{"Texture"},我们可以在后续的Pass中使用TextureName来访问屏幕图像。使用这种方法同样可以抓取屏幕,但Unity只会在每一帧时为第一个使用TextureName的纹理来抓取屏幕的操作,而这个纹理同样可以在其他Pass中被访问,这种方法更高效,因为不管场景中有多少物体使用了该命令,每一帧Unity都只会执行一次抓取操作,但这也意味着所有物体都会使用同一张屏幕图像。不过在大多数情况这已经够了。

  Bloom(扩散)的实现原理非常简单,我们首先根据一个阈值提取出图像中较亮的区域,把他们储存在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终的效果。

kisence

潮落江平未有风。