2013-10-21 80 views
2

我正在製作一個類似化妝間的統一項目。基本功能是改變gameobj的結構(比如鞋子)。所以我想在玩家選擇gameobj的時候達到輪廓效果,我發現修改源代碼着色器的輪廓着色器效果很好。但該人士着色器具有法線和光照性,輪廓着色器只有:如何在unity3d中使用自定義屬性製作輪廓着色器

Shader "Outlined/Silhouetted Diffuse" { 
    Properties { 
     _Color ("Main Color", Color) = (.0,.0,.0,0) 
     _OutlineColor ("Outline Color", Color) = (0,0,0,1) 
     _Outline ("Outline width", Range (0.0, 0.03)) = .01 
     _MainTex ("Base (RGB)", 2D) = "white" { } 
    } 

所以當着色器改變光照貼圖和法線貼圖性能的同時丟失。我不知道如何將這兩個屬性添加到大綱着色器:

Shader "Outlined/Silhouetted Diffuse" { 
    Properties { 
     _Color ("Main Color", Color) = (.0,.0,.0,0) 
     _OutlineColor ("Outline Color", Color) = (0,0,0,1) 
     _Outline ("Outline width", Range (0.0, 0.03)) = .01 
     _MainTex ("Base (RGB)", 2D) = "white" { } 

     //**********add these two properties *********** 
     _BumpMap ("Normalmap", 2D) = "bump" {} 
     _LightMap ("Lightmap (RGB)", 2D) = "black" {} 
} 

回答

2

大綱着色器:Source

Shader "Outlined/Diffuse" { 
    Properties { 
     _Color ("Main Color", Color) = (.5,.5,.5,1) 
     _OutlineColor ("Outline Color", Color) = (0,0,0,1) 
     _Outline ("Outline width", Range (.002, 0.03)) = .005 
     _MainTex ("Base (RGB)", 2D) = "white" { } 
    } 

CGINCLUDE 
#include "UnityCG.cginc" 

struct appdata { 
    float4 vertex : POSITION; 
    float3 normal : NORMAL; 
}; 

struct v2f { 
    float4 pos : POSITION; 
    float4 color : COLOR; 
}; 

uniform float _Outline; 
uniform float4 _OutlineColor; 

v2f vert(appdata v) { 
    // just make a copy of incoming vertex data but scaled according to normal direction 
    v2f o; 
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 

    float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); 
    float2 offset = TransformViewToProjection(norm.xy); 

    o.pos.xy += offset * o.pos.z * _Outline; 
    o.color = _OutlineColor; 
    return o; 
} 
ENDCG 

    SubShader { 
     //Tags {"Queue" = "Geometry+100" } 
CGPROGRAM 
#pragma surface surf Lambert 

sampler2D _MainTex; 
fixed4 _Color; 

struct Input { 
    float2 uv_MainTex; 
}; 

void surf (Input IN, inout SurfaceOutput o) { 
    fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 
    o.Albedo = c.rgb; 
    o.Alpha = c.a; 
} 
ENDCG 

     // note that a vertex shader is specified here but its using the one above 
     Pass { 
      Name "OUTLINE" 
      Tags { "LightMode" = "Always" } 
      Cull Front 
      ZWrite On 
      ColorMask RGB 
      Blend SrcAlpha OneMinusSrcAlpha 
      //Offset 50,50 

      CGPROGRAM 
      #pragma vertex vert 
      #pragma fragment frag 
      half4 frag(v2f i) :COLOR { return i.color; } 
      ENDCG 
     } 
    } 

    SubShader { 
CGPROGRAM 
#pragma surface surf Lambert 

sampler2D _MainTex; 
fixed4 _Color; 

struct Input { 
    float2 uv_MainTex; 
}; 

void surf (Input IN, inout SurfaceOutput o) { 
    fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 
    o.Albedo = c.rgb; 
    o.Alpha = c.a; 
} 
ENDCG 

     Pass { 
      Name "OUTLINE" 
      Tags { "LightMode" = "Always" } 
      Cull Front 
      ZWrite On 
      ColorMask RGB 
      Blend SrcAlpha OneMinusSrcAlpha 

      CGPROGRAM 
      #pragma vertex vert 
      #pragma exclude_renderers gles xbox360 ps3 
      ENDCG 
      SetTexture [_MainTex] { combine primary } 
     } 
    } 

    Fallback "Diffuse" 
}