Unity Shader--简介

来源:互联网 发布:网盘搜索 知乎 编辑:程序博客网 时间:2024/05/02 02:59

unity的shader大致分为如下几类:
最容易上手的Surface Shader,他只能用CG/HLSL语言来编写.
较为复杂但可以深度定制的Vertex Shader和Fragment Shader,可以选择Cg/HLSL,GLSL等等。

1.Surface Shader:他可以大概的看成Unity预置的Shader模板,通常只理物体的表面表现(例如高光,反射等等)。正如Unity官方所说:
直接写一个与照明交互的Shader是复杂的。因为你要考虑不同的光照类型,不同的阴影选项,不同的渲染路径(Forward和Deffered),直接写Shader来处理这些东西是十分复杂的过程。
而Surface Shader是一个代码生成方案,用它编Shader比使用更底层的Vertex Shader/Fragment Shader更容易。但需要注意的是,Surface Shader也不是什么自定义的语言、魔法或者忍术;它只是自动帮你完成那些需要手写的、重复的通用代码。你仍然是用CG/HLSL语言来编写Surface Shader。如果shader不涉及光照,不要用这个surface shader。

2.Vertex Shader和Fragment Shader。
如果简单的模板不能满足我们对于性能、效果等的要求,我们可以采用Vertex Shader和Fragment Shader,功能十分强大。它可以选择不同的语言,但有一些小地方需要注意,比如GLSL就需要在PC设备上强制Unity引擎使用Opengl渲染,Metal只能支持iOS平台。
经过优化的Vertex Shader和Fragment Shader性能通常优于Sufrace Shader,而且定制的代码可以实现Surface Shader模板中不能达到的效果。例如下面这个带有假折射的玻璃效果,Sufrace Shader不容易完成,而Vertex Shader和Fragment Shader则比较轻松搞定。如果不需要涉及到光照,可以考虑使用这个。

3.固定管线编程 fixed function shaders: 功能有限,是传统的shader ,可在所有平台运行,效率高。完全是用ShaderLab来写的。

shader模板:
Shader “MyShader” {
Properties { _MyTexture (“My Texture”, 2D) = “white” { }
// other properties like colors or vectors go here as well
}
SubShader { // here goes the ‘meat’ of your // - surface shader or // - vertex and program shader or // - fixed function shader }
SubShader { // here goes a simpler version of the SubShader // above than can run on older graphics cards }
}

至少要有一个subshader,每次gpu渲染只会执行一个subshader;引擎会按顺序执行subshader,如果第一个shader能够被良好的支持,就会按顺序执行下一个subshader,所以越往下应该是越简单的shader。如果所有的subshader都不能被良好执行,就会执行[FallBack]
其中,surface shaders or vertex and fragment shaders可以用ShaderLab syntax 或者cg,hlsl,glsl语法编写,fixed function shaders只能用ShaderLab syntax编写

ShaderLab不区分大小写
渲染流程图:

这里写图片描述

0 0
原创粉丝点击