Unity Shader的结构(续)

代码介绍

Shader"MyShader"
{
    
    
	Properties
	{
    
    
	//所需的各种属性
	}
	SubShader
	{
    
    
		//真正意义上的Shader代码会出现在这里
		//表面着色器(Surface Shader)
		//顶点/片元着色器(Vertex/Fragment Shader)
		//固定函数着色器(Fixed Function Shader)
	}
	SubShader
	{
    
    
		//和上一个SubShader类似
	}
}

表面着色器

  • 表面着色器(Surface Shader)是Unity自己创造的一种着色器代码类型
  • 背后依旧把它转换成对应的顶点/片元着色器
  • Unity为我们处理了很多关照细节,是的我们不需要在操心这些
  • 表面着色器被定义在SubShader语义块(而非Pass语义块)中的CGPROGRAM和ENDCG之间。原因是,表面着色器不需要开发者关心使用多少个Pass。每个Pass如何渲染等问题,Unity会在背后为我们做好这些事情。
  • CGPROGRAM和ENDCG之间的代码是使用Cg/HLSL编写的,也就是说,我们需要把Cg/HLSL语言嵌套在ShanderLab语言中。

顶点/片元着色器

  • 在Unity中我们可以使用Cg/HLSL语言来编写顶点/片元着色器(Vertex/Fragment/Shader)
  • 它们要更加复杂,但灵活性也更高
  • 和表面着色器类似,顶点/片元着色器的代码也需要定义在CGPROGRAM和ENDCG之间,但不同的是,顶点/片元着色器是编写在Pass语义块内,而非SubShader内的
  • 原因是,我们需要自己定义每个Pass需要的Shader代码

固定函数着色器

现在使用的比较少

如何选择Unity Shader形式

  1. 除非有非常明确的需求使用固定函数着色器,如需要在非常旧的设备上运行你的游戏,否则请使用可编程管线着色器,即表面着色器或顶点/片元着色器
  2. 如果你想和各种光源打交道,你可能更喜欢用表面着色器但需要小心它在移动平台的表现
  3. 如果你需要使用的光源数目非常少,例如只有一个平行光,那么使用顶点/片元着色器是一个更好的选择
  4. 如果你有很多自定义的渲染效果,顶点/片元着色器是个不错的选择

猜你喜欢

转载自blog.csdn.net/weixin_50617270/article/details/123692702