纳金网

标题: 玻璃和车身材质 [打印本页]

作者: 烟雨    时间: 2014-10-31 23:24
标题: 玻璃和车身材质

透明玻璃材质和镜面反射材质都是需要光影技术(Shader)配合的,属于特效材质

Shader "Reflective/Glass" {  

    Properties {  

        _Color ("Main Color", Color) = (1,1,1,1)  

        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)  

        _Shininess ("Shininess", Range (0.01, 1)) = 0.078125  

        _ReflectColor ("Reflect Strength", Color) = (1,1,1,0.5)  

        _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}  

        _Parallax ("Height", Range (0.005, 0.08)) = 0.02  

        _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }  

    }  

    SubShader   

    {  

        LOD 300  

        Tags { "Queue"="Transparent" "IgnoreProjector"="***e" "RenderType"="Transparent"}  

        Blend one OneMinusDstColor  

        ZWrite Off  

         

        // First pass does reflection cubemap  

        Pass   

        {   

            Name "BASE"

            Tags {"LightMode" = "Always"}  

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma fragmentoption ARB_fog_exp2

#pragma fragmentoption ARB_precision_hint_fastest

#include "UnityCG.cginc"  



s***ct v2f {  

    V2F_POS_FOG;  

    float2 uv : TEXCOORD0;  

    float3 I : TEXCOORD1;  

};  



uniform float4 _MainTex_ST;  



v2f vert(appdata_tan v)  

{  

    v2f o;  

    PositionFog( v.vertex, o.pos, o.fog );  

    o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);  



    // calculate object space reflection vector   

    float3 viewDir = ObjSpaceViewDir( v.vertex );  

    float3 I = reflect( -viewDir, v.normal );  

      

    // transform to world space reflection vector  

    o.I = mul( (float3x3)_Object2World, I );  

      

    return o;   

}  



uniform sampler2D _MainTex;  

uniform samplerCUBE _Cube;  

uniform float4 _ReflectColor;  



half4 frag (v2f i) : COLOR  

{  

    half4 texcol = tex2D (_MainTex, i.uv);  

    half4 reflcol = texCUBE( _Cube, i.I );  

    reflcol *= texcol.a;  

    return reflcol * _ReflectColor;  

}   

ENDCG  

        }  



        UsePass "Parallax Specular/PPL"



    }  

    FallBack "Reflective/VertexLit", 1  

}

Shader "Reflective/Glass" {

    Properties {

        _Color ("Main Color", Color) = (1,1,1,1)

        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)

        _Shininess ("Shininess", Range (0.01, 1)) = 0.078125

        _ReflectColor ("Reflect Strength", Color) = (1,1,1,0.5)

        _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}

        _Parallax ("Height", Range (0.005, 0.08)) = 0.02

        _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }

    }

    SubShader

    {

        LOD 300

        Tags { "Queue"="Transparent" "IgnoreProjector"="***e" "RenderType"="Transparent"}

        Blend one OneMinusDstColor

        ZWrite Off

      

        // First pass does reflection cubemap

        Pass

        {

            Name "BASE"

            Tags {"LightMode" = "Always"}

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma fragmentoption ARB_fog_exp2

#pragma fragmentoption ARB_precision_hint_fastest

#include "UnityCG.cginc"



s***ct v2f {

    V2F_POS_FOG;

    float2 uv : TEXCOORD0;

    float3 I : TEXCOORD1;

};



uniform float4 _MainTex_ST;



v2f vert(appdata_tan v)

{

    v2f o;

    PositionFog( v.vertex, o.pos, o.fog );

    o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);



    // calculate object space reflection vector   

    float3 viewDir = ObjSpaceViewDir( v.vertex );

    float3 I = reflect( -viewDir, v.normal );

   

    // transform to world space reflection vector

    o.I = mul( (float3x3)_Object2World, I );

   

    return o;

}



uniform sampler2D _MainTex;

uniform samplerCUBE _Cube;

uniform float4 _ReflectColor;



half4 frag (v2f i) : COLOR

{

    half4 texcol = tex2D (_MainTex, i.uv);

    half4 reflcol = texCUBE( _Cube, i.I );

    reflcol *= texcol.a;

    return reflcol * _ReflectColor;

}

ENDCG

        }



        UsePass "Parallax Specular/PPL"



    }

    FallBack "Reflective/VertexLit", 1

}



车身shader用Reflective/Specular中的一种



然后加入以下脚本:



RenderToCubemap.js:



// Attach this script to an object that uses a Reflective shader.  

// Realtime reflective cubemaps!  

@script ExecuteInEditMode  



var cubemapSize = 128;  

var oneFacePerFrame = false;  

private var cam : Camera;  

private var rtex : RenderTexture;  



function Start ()   

{  

    // render all six faces at startup  

    UpdateCubemap( 63 );  

}  



function LateUpdate ()   

{  

    if (oneFacePerFrame)   

    {  

        var faceToRender = Time.frameCount % 6;  

        var faceMask = 1 << faceToRender;  

        UpdateCubemap (faceMask);  

    }   

    else   

    {  

        UpdateCubemap (63); // all six faces  

    }  

}  



function UpdateCubemap (faceMask : int)   

{  

    if (!cam)   

    {  

        var go = new GameObject ("CubemapCamera", Camera);  

        go.hideFlags = HideFlags.HideAndDontSave;  

        go.transform.position = transform.position;  

        go.transform.rotation = Quaternion.identity;  

        cam = go.camera;  

        cam.farClipPlane = 100; // don't render very far into cubemap  

        cam.enabled = false;  

    }  



    if (!rtex)   

    {   

        rtex = new RenderTexture (cubemapSize, cubemapSize, 16);  

        rtex.isPowerOfTwo = ***e;  

        rtex.isCubemap = ***e;  

        rtex.hideFlags = HideFlags.HideAndDontSave;  

        renderer.sharedMaterial.SetTexture ("_Cube", rtex);  

    }  



    cam.transform.position = transform.position;  

    cam.RenderToCubemap (rtex, faceMask);  

}  



function OnDisable ()   

{  

    DestroyImmediate (cam);  

    DestroyImmediate (rtex);  

}

作者: tianhett    时间: 2014-11-1 14:17
Thanks For Sharing!!!
作者: hyui    时间: 2014-11-3 03:51
Goood code !!!!




欢迎光临 纳金网 (http://course.narkii.com/club/) Powered by Discuz! X2.5