UnityShader自学笔记(一)
Shader自学笔记
定义
UnityShader != Shader
是对Shader得一种高度封装,可通过简单指令对开启混合、深度测试等进行设置。
不需要编写冗长代码设置着色器输入输出、考虑输入输出位置与对应关系
但对Shader类型和语法都有限制
语法格式
顶点/片元着色器
shader“名字”
SubShader
{
Pass{
CGPROGRAM
#pragma vertex 名字a //顶点着色器函数名字
#pragma fragment 名字b //片段着色器的名字
float4 名字a (float4 v:POSITION) : SV_POSITION {
return mul (UNITY_MATRIX_MVP, v);
}
fixed4 名字b() : SV_Target { //返回一个红色的颜色值 return fixed4(1.0,0.0,0.0,1.0);
}
ENDCG
}
这部分我自己查的,拓展了解:
SV_POSITION 属于语义绑定 与POSITION 用法无异
SV_前缀 代表 system value
区别: SV_POSTION被作为vertex shader的输出语义时,最终的顶点位置便被固定了,直接进入光栅化处理。如果作为fragment shader的输入语义那么和POSITION是一样的,代表着每个像素点在屏幕上的位置。
表面着色器
Unity创造的一种着色器,代码量小,渲染代价大)
表面着色器是Unity对顶点/片元着色器的更高一层抽象
shader“名字”
//预设属性
Properties {
}
SubShader
{
//标记键值对,用于确认渲染顺序和子渲染器的其他参数
Tags{"RenderType" = "Opaque"}
CGPROGRAM
//光照模式声明:使用兰伯特光照模式
#pragma surface surf Lambert
//输入结构
struct Input
{
//四元素的颜色值(RGBA)
float4 color : COLOR;
};
//表面着色函数的编写
//函数名可以随便定义
void surf (Input IN, inout SurfaceOutput o)
{
//反射率
o.Albedo = float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
//而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
}
ENDCG
}
Fallback "Diffuse"
拓展
所有shaders都拥有一个渲染类型标签,比如 “Opaque”, “Transparent”, “Background”, “Overlay”,你就可以编写一个含有”RenderType = Solid”的替换着色器来只渲染固体物体。其他标记并不会在该替换着色器中被找到,所以与其对应的物体将不会被渲染。或者,你可以编写拥有不同的”RenderType”标签值的子着色器。所有Unity内置着色器都含有一个”RenderType”标签集。
在Unity内置着色器的shader替换标签
Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器terrain additive pass shaders)。
TransparentCutout: 蒙皮透明着色器masked transparency shaders (Transparent Cutout,两个通道的植被着色器)。
Background: Skybox shaders.
Overlay: GUITexture,光晕,闪光着色器。
TreeOpaque: 地形引擎中的树皮。
TreeTransparentCutout: terrain engine tree leaves.
TreeBillboard: terrain engine billboarded trees. Grass: terrain
GrassBillboard: terrain engine billboarded grass.
固定着色器
现在GPU都支持渲染管线了,固定着色器深追下去没太大意义
上一篇: chrome新版本(60以上)出现uploadify控件失败
下一篇: html标签内容超出怎么办