2014-01-25 2 views
0

Я пытаюсь настроить этот шейдер, который я получил из сети, чтобы иметь белый контур, а не черный. но «_OutlineColor (« Цвет контура »,« Цвет »= (1,1,1,1)» не работает. Я новичок в единстве и как все работает, поэтому я надеюсь, что вы можете мне помочь. здесь полный шейдер:Контур Shader в Unity3d

Shader "Outlined/Diffuse" { 
    Properties { 
     _Color ("Main Color", Color) = (0,0,0,0) 
     _OutlineColor ("Outline Color", Color) = (1,1,1,1) 
     _Outline ("Outline width", Range (.002, 0.03)) = 5 
     _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" 
} 
+1

Проверьте цвет белого цвета в материале Инспектор. Настройки Inspector Unity заменяют значения, которые вы жестко кодируете в шейдере. – Jerdak

ответ

0

«(1,1,1,1)» вы присваиваете «_OutlineColor» описывает значение по умолчанию. Это значение принимается во внимание при создании нового материала, который использует этот шейдер (здесь «Обрезанный/Диффузный»). Просто создайте новый материал и назначьте ему свой шейдер. Вы заметите, что цвет Outline на этот раз будет белым. Также вы можете просто выбрать свой материал в редакторе и изменить цвет контура через окно инспектора.

Что касается вашей проблемы - возможно, вы создали новый материал в сочетании с описанным шейдером, прежде чем вы изменили тело шейдера от черного (0,0,0,1) до белого (1,1 , 1,1) цвет (я распознаю тело шейдера, поэтому я предполагаю черный цвет). И это означает, что черный цвет по умолчанию уже назначен материалу. Если вы хотите изменить цвет, как я писал выше, сделайте это на материале через инспектора редактора.

Смежные вопросы