美文网首页Unity Shader分享
使用shader实现地球旋转的效果(转)

使用shader实现地球旋转的效果(转)

作者: 树上的cat_ee3c | 来源:发表于2017-10-27 18:20 被阅读321次

    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

    相关文章

      网友评论

        本文标题:使用shader实现地球旋转的效果(转)

        本文链接:https://www.haomeiwen.com/subject/rtsdpxtx.html