使用shader实现地球旋转的效果(转)
Shader"CustomPractice/Earth"{
Properties{
//地球纹理
_EarthTex("EarthTex",2D)="white"{}
//云的纹理
_CloudTex("CloudTex",2D) ="white"{}
}
Subshader{
Tags{"RendrType"="Transparent"}
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _EarthTex;
sampler2D _CloudTex;
structv2f {
float4 vertex:POSITION;
float4 texcoord:TEXCOORD0;
};
voidvert(inout v2f v){
v.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
}
fixed4 frag(v2f v):COLOR{
//渲染球
fixedu = v.texcoord.x +_Time*0.1;
float2 uv = float2(u,v.texcoord.y);
fixed4 earthColor = tex2D(_EarthTex,uv);
//渲染层
fixeduc=v.texcoord.x+ _Time*0.3;
float2 uvc = float2(uc,v.texcoord.y);
fixed4 cloudColor = tex2D(_CloudTex,uvc);
cloudColor = cloudColor.r * fixed4(1,1,1,1);
//取出地球颜色和云颜色的插值
returnlerp(earthColor,cloudColor,0.5);
}
ENDCG
}
}
}
2.使用shader实现卡通人物透明
Shader"CustomPractice/David02"{
Properties{
_MainTex("Albedo(RGB)",2D) ="white"{}
_LogoTex("LogoTex",2D) ="white"{}
}
Subshader{
Tags{"RenderType"="Transparent"}
//透明设置
Blend SrcAlpha OneMinusSrcAlpha
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _LogoTex;
voidvert(inout appdata_base v){
v.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
}
fixed4 frag (appdata_base v):COLOR{
fixed4 col = tex2D(_MainTex,v.texcoord);
fixed4 logo = tex2D(_LogoTex,v.texcoord);
returncol*logo;
}
ENDCG
}
}
FallBack"diffuse"
}
3.使用shader实现河流流动的效果
Shader"CustomPractice/River"{
//
Properties{
_Color("Color",color) = (1,1,1,1)
_MainTex("Albeo(RGB)",2D) ="white"{}
_RiverSpeedX("X_Speed",range(2,10)) = 7
_RiverSpeedY("Y_Speed",Range(2,10)) = 7
}
Subshader{
Tags{"RenderType"="Opaque"}
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
fixed4 _Color;
fixed_RiverSpeedX;
fixed_RiverSpeedY;
//输入结构体
structInput{
float2 uv_MainTex;
};
voidsurf (Input IN,inout SurfaceOutput o){
//水流的速度
//使用内置的_Time变量来根据运行时间滚动Texture ,水流速度
fixedxSpeed = _RiverSpeedX*_Time;
fixedySpeed = _RiverSpeedY*_Time;
//将根据时间的变化速度值的值组合成新的uv 坐标
fixed2 uv = IN.uv_MainTex + fixed2(xSpeed,ySpeed);
//对谁流图片进行采样
fixed4 c = tex2D(_MainTex,uv)*_Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
fallback"Diffuse"
}
4.使用shader实现彩虹桥的颜色
//顶点,片段着色器的流程:
//1.首先,vertex program 收到系统传递给他的模型数据
//2.然后把这些数据处理我们后续需要的数据(至少包含顶点位置信息)
//3.进行输出,其他的数据还有:纹理的UV坐标
//4.系统对vertex program输出的顶点数据进行插值运算,并将插值的
//运算结果传递给fragment program
//5.最后fragment program 根据这些插值结果计算成屏幕上显示的像素颜色
Shader"CustomLearn/Fourth-VertexShader"{
//属性
Properties{
_myColor("Color",Color)=(1,1,1,1)
_outLine("OutLine",Range(0,1))= 0.1
}
Subshader{
//渲染不透明物体,渲染类型:非透明物体,不受投影的影响
Tags{"Queue"="Geometry""RenderType"="Opaque""IgnoreProjector"="True"}//第一个通道
pass{
CGPROGRAM
//告诉程序定义顶点着色器
#pragma vertex vert
//告诉程序定义一个片段着色器
#pragma fragment frag
//使用顶点和片段着色器时.引入对应的CG函数库,相当于引入
//C#的命名空间,UnityCG.cginc包含常用的属性和函数
#include "UnityCG.cginc"
fixed4 _myColor;
//定义"vertex to fragment"结构体
//v2f :表示顶点函数到片段程序信息传递
//这里的传递是位置和颜色的传递
//顶点着色器计算color并且输出给片段着色器
structv2f {
//在顶点向片段传递数据过程中,还可以包含以下信息
//1.float4 vertex:POSITION 顶点位置
//2. float3 normal:NORMAL 顶点法线
//3. float4 texcoord:TEXCOORD 第一uv坐标
//4. float4 tangent :TEXCOORD1第二uv坐标
//5.float4 tanggent:TANGENT;顶点切线
//6. float4 color:COLOR:每个顶点的颜色
// 这里的SV_前缀,表示的是System Value(类似命名空间)
//POSITONG表示每个像素点在屏幕上的位置
//SV_POSTION和POSITON的区别:当SV:POSITION作为
//Vertex Shader 输出语义时,这个最终的顶点位置就被固定了,
//如果作为Vertex Shader输出语义时,那么作用就和POSITION
//一样代表每个像素点在屏幕上的位置
float4 pos:SV_POSITION;
float3 color:COLOR;
};
//顶点函数,参数是一个结构体,返回值也是一个结构体
//参数 appdata full是"UnityCG.cginc"结构体类型
//顶点函数中结构体参数类型有:
//appdata_full;包含顶点位置,切线,法线,和两个纹理坐标
//appdata_bass:包含顶点位置,法线和一个纹理坐标
//appdata_tan包含顶点位置,法线,切线和一个纹理坐标
//appdata_img:包含顶点位置和一个纹理坐标
v2f vert(appdata_full v){
//定义一个根据顶点信息计算后的片段信息结构体
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.color = v.vertex*0.8+0.5;
returno;
}
fixed4 frag(v2f i):COLOR{
returnfixed4(i.color *_myColor,1);
}
ENDCG
}
//第二个通道
pass{
Name"Border"
Tags{"LightModel"="ForwardBase"}
//前方剔除
cull Front
Lighting On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//编译指令,编译正向渲染基础通道
//用于正向渲染中,应用环境光光照,主方向光照和顶点所需要的光照
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
//float相当于Range类型
float_outLine;
structa2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
};
structv2f{
float4 pos:POSITION;
};
v2f vert(a2v v){
v2f o;
float4 pos = mul(UNITY_MATRIX_MV,v.vertex);
float3 normal = mul(UNITY_MATRIX_IT_MV,v.normal);
//外部轮廓的厚度
pos = pos +float4(normalize(normal),0)*_outLine;
o.pos = mul(UNITY_MATRIX_P,pos);
returno;
};
fixed4 frag (v2f i):COLOR{
returnfixed4(0,0,0,1);
}
ENDCG
}
}
}
转:http://blog.csdn.net/qq_37365526/article/details/74352592?locationNum=4&fps=1