`
aijun980204
  • 浏览: 95879 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Unity3d 车身、玻璃材质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"="True" "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"  
 
struct 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"="True" "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"

struct 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 = true;  
        rtex.isCubemap = true;  
        rtex.hideFlags = HideFlags.HideAndDontSave;  
        renderer.sharedMaterial.SetTexture ("_Cube", rtex);  
    }  
 
    cam.transform.position = transform.position;  
    cam.RenderToCubemap (rtex, faceMask);  
}  
 
function OnDisable ()   
{  
    DestroyImmediate (cam);  
    DestroyImmediate (rtex);  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics