查看: 1785|回复: 0
打印 上一主题 下一主题

玻璃和车身材质

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-8-23 14:14:48 |只看该作者 |倒序浏览
透明玻璃材质和镜面反射材质都是需要光影技术(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 "arallax 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 "arallax 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);  

}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 10:17 , Processed in 0.099966 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部