使用shader效果

来源:互联网 发布:java经典代码大全 编辑:程序博客网 时间:2024/06/05 17:42
1.使用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; struct v2f { float4 vertex:POSITION; float4 texcoord:TEXCOORD0; }; void vert(inout v2f v){ v.vertex = mul(UNITY_MATRIX_MVP,v.vertex); } fixed4 frag(v2f v):COLOR{ //渲染球 fixed u = v.texcoord.x +_Time*0.1; float2 uv = float2(u,v.texcoord.y); fixed4 earthColor = tex2D(_EarthTex,uv); //渲染层 fixed uc=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); //取出地球颜色和云颜色的插值 return lerp(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 OneMinusSrcAlphapass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;sampler2D _LogoTex;void vert(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);return col*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 Lambertsampler2D _MainTex;fixed4 _Color;fixed _RiverSpeedX;fixed _RiverSpeedY;//输入结构体struct Input{float2 uv_MainTex;};void surf (Input IN,inout SurfaceOutput o){//水流的速度//使用内置的_Time变量来根据运行时间滚动Texture ,水流速度fixed xSpeed = _RiverSpeedX*_Time;fixed ySpeed = _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并且输出给片段着色器struct v2f {//在顶点向片段传递数据过程中,还可以包含以下信息//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;return o;}fixed4 frag(v2f i):COLOR{return fixed4(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;  struct a2v {  float4 vertex:POSITION;  float3 normal:NORMAL;  };  struct v2f{  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);  return o;  };  fixed4 frag (v2f i):COLOR{  return fixed4(0,0,0,1);  }  ENDCG  }}}


 
原创粉丝点击