2016-03-27 40 views
1

Clip() işleviyle neredeyse yatay halkalardaki pikselleri atarak nesneyi “kesen” unity elkitabından this one benzeri bir gölgelendiriciyi kodlamaya çalışıyorum.Unity worldPos ilgili yönü

Shader "Example/Slices" { 
    Properties { 
     _MainTex ("Texture", 2D) = "white" {} 
     _BumpMap ("Bumpmap", 2D) = "bump" {} 
    } 
    SubShader { 
     Tags { "RenderType" = "Opaque" } 
     Cull Off 
     CGPROGRAM 
     #pragma surface surf Lambert 
     struct Input { 
      float2 uv_MainTex; 
      float2 uv_BumpMap; 
      float3 worldPos; 
     }; 
     sampler2D _MainTex; 
     sampler2D _BumpMap; 
     void surf (Input IN, inout SurfaceOutput o) { 
      clip (frac((IN.worldPos.y+IN.worldPos.z*0.1) * 5) - 0.5); 
      o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb; 
      o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); 
     } 
     ENDCG 
    } 
    Fallback "Diffuse" 
    } 

Sadece yatay çizgilerden ziyade, rasgele bir açıyla dilimlemek istiyorum. worldPos Z çarpan gerçekten dilimin açısını değiştirmek olmadığını (ben kodlama shaderlara yeniyim beri) ben deney neticesinde, bu yüzden buna bir özellik değişkeni ayarlayın: iki sorun ancak

clip (frac((IN.worldPos.y+IN.worldPos.z*_MYANGLEVARIABLE) * 5) - 0.5); 

Bu sahiptir . 1) 1,0'a kadar olan değerler satırları 45 dereceye kadar döndürür, ancak bunun ötesinde çizgiler "dalgalı" gitmeye başlar ve düzgün çizgilerden ziyade her türlü desenlere dönüşür ve 2) bu sadece yüz pozitif yönde yönlendirilirse çalışır. veya negatif X ekseni. Z'e bakarken çizgiler hareket etmiyor ve Y'ye bakarken daha büyük oluyorlar ama dönmüyorlar. Benzer bir durum ama beklendiği gibi 1) keyfi açıları elde nasıl yerine X

Herhangi bir fikir daha Z'ye çalışan -

IN.worldPos.x için IN.worldPos.y Tahmin edebileceğiniz mu neyi değiştirme? 2) Yüz yönüne bakılmaksızın çalışmasını sağlayın mı?

Ben worlPos kullanıyorum çünkü her zaman hatların ekran alanı yerine nesneye göre olmasını istiyorum, ancak belki başka bir yol var mı? Benim gerçek gölgelendiricim, & yüzey gölgelendiricisi yerine bir parçadır, worldPos'u dikeyden fragmana geçiriyorum.

çok teşekkürler

+0

dat görünüyor ... – Fattie

cevap

0

normal vektörü kullanarak bir uçak tanımlamak ve nokta ürünü kullanmadan klibi keyfi açıları almak için.

Shader "Example/Slices" { 
    Properties { 
    _MainTex ("Texture", 2D) = "white" {} 
    _BumpMap ("Bumpmap", 2D) = "bump" {} 
    _PlaneNormal ("Plane Normal", Vector) = (0, 1, 0) 
    } 
    SubShader { 
    Tags { "RenderType" = "Opaque" } 
    Cull Off 
    CGPROGRAM 
    #pragma surface surf Lambert 
    struct Input { 
     float2 uv_MainTex; 
     float2 uv_BumpMap; 
     float3 worldPos; 
    }; 
    sampler2D _MainTex; 
    sampler2D _BumpMap; 
    float3 _PlaneNormal; 
    void surf (Input IN, inout SurfaceOutput o) { 
     float d = dot(_PlaneNormal, IN.worldPos); 
     clip (frac(d) - 0.5); 
     o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb; 
     o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); 
    } 
    ENDCG 
    } 
    Fallback "Diffuse" 
} 

Burada normal vektör ne kadar uzun olursa, dilimler o kadar sık ​​görülür.

Dilimlerin nesneye göre olmasını istiyorsanız, worldPos dışındaki bir dizi koordinatı kullanmanız gerekir. Muhtemelen bu cevap yardımcı olacaktır: http://answers.unity3d.com/questions/561900/get-local-position-in-surface-shader.html