谈起 Shader 可能不得不说起图形化编程,不过这里呢就不过多谈及相关的开发细节,而主体关注Unity 兼容的 Shader 也就是 Shaderlab 编程。就目前了解的 Unity 下 Shader 分类来说有三种,surface shaders,vertex and fragment shaders 和 fixed function shaders。
其实就目前涉及到的可编程图形管线中,我们能够编写Shader的部分就是 vertex and fragment shaders,那为嘛 Unity 当中还会出现其他两种类型呢?
首先来说下 fixed function shaders(固定管线),在可编程图形管线硬件出现之前,很多的光照信息计算都是放在硬件上进行处理的,而这种固定管线 Shader 的功能在目前大多数硬件上得到支持,同样它的实现相对保守,只能进行简单的光照和纹理采样等等。
然后我们来看 surface shaders,这是Unity主张鼓励使用的 Shader 编写方式,现在随意在 Unity 中创建的 Shader 文件其实就是 surface shader,那说白了 surface shaders 就是对 vertex and fragment shaders 的包装,最后的编译到底层的时候也是以 vertex and fragment shaders 的形式输入的。
说完 Unity Shader的三种形态,我们再来看在 Unity 中 Shaderlab 的基本结构
Unity 中的所有 Shaders 文件都使用名为“ShaderLab”的声明性语言编写。在文件中,嵌套大括号语法声明了描述着色器的各种内容 - 例如,应在材质检查器中显示哪些着色器属性;什么样的硬件后备要做;使用什么样的混合模式等。
如图所示,一个 Shader 文件必须要有的几个因素:
首先 Shader 文件的名称,这里指代的可以是文件的名称也可以是具体目录下的名称,然后就是 Properties,这换个角度来说就是图形程序中函数运行中需要的变量数据,一般来说属性可以是浮点值,贴图以及颜色等,当然Properties在Shader文件中其实不是必须的,而我们的 SubShaders 则是真正运行图形程序的地方,Shader 文件一般至少得有一个 SubShader,而至于会存在多个 SubShader 的原因,也是针对不同的设备硬件支持能力,第一个 SubShader 面向性能特别好的设备,第二个再兼容剩下的设备,由此类推。
shader “name”{
[Properties] // 属性参数可有可无,看功能需求
SubShaders // Shader文件中必须得有
[FallBack] // 可有可无,当Shader文件中的SubShader 设备都不支持的时候 返回一个默认显示
}
当然真正完整的 Shader 文件构成还涉及到其他东西,这个也就后说了。
留言与评论(共有 0 条评论) |