UNITY3D shader学习心得<三> Vertex and Fragment Shader
2016-03-10 22:02
465 查看
Vertex and Fragment Shader:最强大的Shader类型,可编程渲染管线.
使用的是CG/HLSL语法。分为2个部分vertex顶点部分和Fragment像素部分。
Pass
{
Name "MyPass" //Pass名称
Tags {"LightMode"="Always"} //光照模式
CGPROGRAM //CG程序开始,嵌入CG程序
#pragma vertex vert //预编译指令 指定顶点函数的名字 必须实现 渲染管线自动调用 vertex要小写
#pragma vragment frag //预编译指令 指定片段函数的名字 必须实现 渲染管线自动调用
vragment要小写
#pragma Target 3.0 //shader模式版本3.0 默认是2.0
#include "UnityCG.cginc" //包含"UnityCG.cginc"文件 路径在:\Editor\Data\CGIncludes
sampler2D _MainTex; //声明贴图 要和根Shader里的Properties的变量名对应。
float4 _Color; //声明颜色
//vertex函数输出结构体,也是fragment函数输入结构体
struct v2f{
float4 pos:SV_POSITION; // :SV_POSITION 指明语义,顶点位置 语义都是大写
float4 texcoord:TEXCOORD0; // 纹理坐标
} ; //结构体后面要加 ; 号
//vertex函数实现 appdate_base是UnityCG.cginc里定义的结构体
v2f vert(appdate_base v){
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex); //使用HLSL中的mul函数 将顶点位置转化为投影坐标系位置。
o.texcoord=v.vertex;
return o;
}
//fragment函数实现
half4 frag(v2f i):COLOR{ //指明函数返回的是COLOR,输出颜色
half4 col= _Color*tex2D(_MainTex,i.texcoord.xy);
//使用tex2D函数 将位置信息和贴图相乘。得到每个点贴图纹理。
return col;
}
ENDCG //CG程序结束
}
!!!!! 颜色取值范围是0-1 颜色四个值用XYZW表示 UV是0到1
normal是-1到1
LightMode 的可选值:
Always:
总是渲染。没有光照应用。
ForwardBase:
用于正向渲染,环境主要方向灯和定点光/SH 等的应用
ForwardAdd: 用于正向渲染,附加的像素光被应用,每个光照一个pass
PrepassBase: 用于延迟光照,渲染法线/镜面指数。
PrepassFinal:
用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色
Vertex:
用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用
VertexLMRGBM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码
VertexLM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)
ShadowCaster:
将物体当做阴影产生者来渲染
ShadowCollector:
为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
使用的是CG/HLSL语法。分为2个部分vertex顶点部分和Fragment像素部分。
Pass
{
Name "MyPass" //Pass名称
Tags {"LightMode"="Always"} //光照模式
CGPROGRAM //CG程序开始,嵌入CG程序
#pragma vertex vert //预编译指令 指定顶点函数的名字 必须实现 渲染管线自动调用 vertex要小写
#pragma vragment frag //预编译指令 指定片段函数的名字 必须实现 渲染管线自动调用
vragment要小写
#pragma Target 3.0 //shader模式版本3.0 默认是2.0
#include "UnityCG.cginc" //包含"UnityCG.cginc"文件 路径在:\Editor\Data\CGIncludes
sampler2D _MainTex; //声明贴图 要和根Shader里的Properties的变量名对应。
float4 _Color; //声明颜色
//vertex函数输出结构体,也是fragment函数输入结构体
struct v2f{
float4 pos:SV_POSITION; // :SV_POSITION 指明语义,顶点位置 语义都是大写
float4 texcoord:TEXCOORD0; // 纹理坐标
} ; //结构体后面要加 ; 号
//vertex函数实现 appdate_base是UnityCG.cginc里定义的结构体
v2f vert(appdate_base v){
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex); //使用HLSL中的mul函数 将顶点位置转化为投影坐标系位置。
o.texcoord=v.vertex;
return o;
}
//fragment函数实现
half4 frag(v2f i):COLOR{ //指明函数返回的是COLOR,输出颜色
half4 col= _Color*tex2D(_MainTex,i.texcoord.xy);
//使用tex2D函数 将位置信息和贴图相乘。得到每个点贴图纹理。
return col;
}
ENDCG //CG程序结束
}
!!!!! 颜色取值范围是0-1 颜色四个值用XYZW表示 UV是0到1
normal是-1到1
LightMode 的可选值:
Always:
总是渲染。没有光照应用。
ForwardBase:
用于正向渲染,环境主要方向灯和定点光/SH 等的应用
ForwardAdd: 用于正向渲染,附加的像素光被应用,每个光照一个pass
PrepassBase: 用于延迟光照,渲染法线/镜面指数。
PrepassFinal:
用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色
Vertex:
用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用
VertexLMRGBM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码
VertexLM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)
ShadowCaster:
将物体当做阴影产生者来渲染
ShadowCollector:
为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
相关文章推荐
- unity3D中的工程导入eclipse做二次开发
- unity3D中的工程导入eclipse做二次开发
- unity 快速创建小地图
- unity 快速创建小地图
- Unity3D:unity与Android相互传递消息 & unity与ios相互传递消息
- Unity5.0 摄像机 Clear Flags和Culling Mask属性用途详解
- 【转】unity基础问题汇总
- Unity3D 学习笔记4 —— UGUI+uLua游戏框架
- Android NDK编译C/C++结合Unity实现本地数据共享
- Unity 与 OC 不得不说的故事。。
- 【风宇冲】Unity3D性能优化:DrawCall优化
- Unity(64bit)5.1 打开无故出现框框,纹理不见了
- unity与android交互
- Unity3d_AssetPostprocessor简单用法
- iOS+Unity
- Unity Camera Orthographic Size
- Unity学习疑问记录之坐标体系
- Unity 导出iOS项目 在真机调试 xcode V7.2.1
- 移植UE4的Spline与SplineMesh组件到Unity5
- Unity: EasyJoystick.cs