首页 > 代码库 > shaderlab_2
shaderlab_2
Unity3d的三种Shader
Unity的Shader分为三种:
(1)Fixed function shader 属于固定渲染管线 Shader,基本用于高级Shader在老显卡无法显示时的Fallback(之后有详细介绍)。使用的是ShaderLab语言,语法与微软的FXfiles 或者NVIDIA的 CgFX类似。
(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线.使用的是CG/HLSL语法。
(3)Surface ShaderUnity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法。
Unity3d三种Shader对比
三种Shader共同点:
(1)都必须从唯一一个根Shader开始
(2)Properties参数部分,作用及语法完全相同
(3)具体功能都在SubShader里(Subshader:子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。)
(4)都可以打标签,例如Tags { "RenderType" = "Opaque" } LOD 200 以及Lighting On等
(5)都可以Fallback
(6)都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。但是Vertexand Fragment和Surface都能实现Fixed function实现不了的高级功能,例如基于uv计算的效果等等。
三种Shader不同点:
(1)Fixed function shader以及Vertex and FragmentShader在subshader下面还有pass{},但是SurfaceShader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。
(2)Fixed functionshader每句代码之后没有分号‘;‘ 但是V&F shader以及Surfaceshader每句代码之后都必须加分号‘;‘
(3)核心结构不同:
Fixed functionshader的核心是
Material{} 以及 SetTexture[_MainTex]{}
Vertex andFragment Shader的核心是
#pragma surface surf Lambert
ENDCG
或者(2)这套表示使用的是自己写的光照模型lsyLightModel,并且使用了顶点处理函数vert
CGPROGRAM
// surface 表面处理函数 光照模型函数 顶点处理:函数
#pragma surface surf lsyLightModel vertex:vert
//执行顺序 顶点处理函数 -> 表面处理函数 -> 光照模型函数->颜色值
ENDCG
三种Shader共同点:
(1)都必须从唯一一个根Shader开始
(2)Properties参数部分,作用及语法完全相同
(3)具体功能都在SubShader里(Subshader:子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。)
(4)都可以打标签,例如Tags { "RenderType" = "Opaque" } LOD 200 以及Lighting On等
(5)都可以Fallback
(6)都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。但是Vertexand Fragment和Surface都能实现Fixed function实现不了的高级功能,例如基于uv计算的效果等等。
三种Shader不同点:
(1)Fixed function shader以及Vertex and FragmentShader在subshader下面还有pass{},但是SurfaceShader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。
(2)Fixed functionshader每句代码之后没有分号‘;‘ 但是V&F shader以及Surfaceshader每句代码之后都必须加分号‘;‘
(3)核心结构不同:
Fixed functionshader的核心是
Material{} 以及 SetTexture[_MainTex]{}
Vertex andFragment Shader的核心是
- CGPROGRAM
- #pragma vertex vert
- #pragma fragmentfrag
- #include "UnityCG.cginc"
- ENDCG
SurfaceShader的核心是
(1)这套用的是Unity3d自带光照模型Lambert,也不做顶点处理,那么只需要一个表面处理函数surf即可
CGPROGRAM#pragma surface surf Lambert
ENDCG
或者(2)这套表示使用的是自己写的光照模型lsyLightModel,并且使用了顶点处理函数vert
CGPROGRAM
// surface 表面处理函数 光照模型函数 顶点处理:函数
#pragma surface surf lsyLightModel vertex:vert
//执行顺序 顶点处理函数 -> 表面处理函数 -> 光照模型函数->颜色值
ENDCG
shaderlab_2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。