您的位置:首页 > 移动开发 > Unity3D

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:
为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: