Unity3D Shader学习之五—Shader三种类型
Unity Shader有三种类型,分别是固定功能着色器 (Fixed Function Shaders)、表面着色器(Surface Shaders)、顶点和片段着色器。 固定功能着色器 (Fixed Function Shaders)适用于不支持可编程着色器的旧硬件,固定功能着色器完全使用 ShaderLab 语言(类似于 Microsoft’s .FX 文件或 NVIDIA’s CgFX)进行编写。 表面着色器(Surface Shaders)如需让您的着色器受到光线和阴影的影响,那么表面着色器 (Surface Shaders) 是您最好的选择,表面着色器可让您以简单的方法编写复杂的着色器 - 这是与 Unity 照明管道的更高层次交互提取。大部分表面着色器自动支持正向和延迟照明。可用数行 Cg/HLSL 编写表面着色器,且其中将生成更多代码。如果着色器未对光线进行任何处理,请勿使用表面着色器 顶点和片段着色器如果着色器无需与照明互动,或者需要制作一些表面着色器无法实现的非凡效果,则需使用顶点和片段着色器。按此方法编写的着色器程序可让您以最灵活的方式制作所需的效果,也可使用 Cg/HLSL 编写这些着色器。 固定功能着色器主要针对旧硬件,图形接口API仅支持通过修改配置进行控制,这些完全可以通过编程API来实现,在Unity内部也会把固定功能着色器编译为顶点和片段着色器。 同样的表面着色器最终也会编译为顶点和片段着色器,故对于Unity Shader可以认为只有一种类型,学习时把主要精力放在顶点和片段着色器就行了(个人观点)。 固定功能着色器示例:
Shader "Tutorial/Basic" {
Properties {
_Color ("Main Color", Color) = (1,0.5,0.5,1)
}
SubShader {
Pass {
Material {
Diffuse \[_Color\]
}
Lighting On
}
}
}
表面着色器示例
Shader "Example/Diffuse Simple" {
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = 1;
}
ENDCG
}
Fallback "Diffuse"
}
顶点和片段着色器示例
Shader "VertexInputSimple" {
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY\_MATRIX\_MVP, v.vertex);
o.color.xyz = v.normal * 0.5 + 0.5;
o.color.w = 1.0;
return o;
}
fixed4 frag (v2f i) : COLOR0 { return i.color; }
ENDCG
}
}
}
表面着色和顶点和片段着色器的区别是:表面着色器的定义是在SubShader块中,顶点着色器的定义是在Pass中。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com
文章标题:Unity3D Shader学习之五—Shader三种类型
文章字数:664
本文作者:max-xue
发布时间:2016-10-28, 14:56:55
最后更新:2019-11-09, 22:31:50
原始链接:http://blog.le-more.com/2016/10/28/u3d/unity3d-shader-e5-shader-e7/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。