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

车身、玻璃材质shader

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

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

跳转到指定楼层
楼主
发表于 2012-2-24 14:17:30 |只看该作者 |倒序浏览
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 "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"="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 "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 = 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);   

}



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

使用道具 举报

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

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

GMT+8, 2025-2-22 05:25 , Processed in 0.068045 second(s), 32 queries .

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

© 2008-2019 Narkii Inc.

回顶部