2016-03-21 26 views
0

Şu anda bir karakterin arka planda hareket edebileceği bir oyun geliştiriyorum. Fikir, bu karakterin bu arka planı kazması olacaktır. Bir shader tarafından yapılması gerektiğini düşünüyorum ama onunla yeni başlayan biriyim. .Gölgede delik oluşturmak için Shader Unity 2d

Karakterin bu pikselin konumundan çok uzak olması gibi bir şey hayal edebiliyorum, bu nedenle bu pikselin alfa değeri 0'dır. Ve alfa'yı 0'da tutmak için alfa 0'a eşit değil. karakter testi yapmak.

Ancak şimdilik, sprite/diffuse shader ile temel olarak denedim ve piksellerin konumunu elde etmenin bir yolunu bulamıyorum. Sörf fonksiyonunda bir şey denedim ama gerçek bir sonuç çıkmadı. Sörf fonksiyonunun bir kere pixel no ile çalıştırılması gerekiyordu?

Yardım için şimdiden teşekkür ederiz.

Edit Sonunda bir dikey parça gölgelendirici almak için bazı şeyler denedim. Dediğim gibi, alfa ile piksel arasındaki mesafeyi hesaplamaya çalışıyorum. Şimdilik hatam nerede olduğunu anlayamıyorum ama belki biraz daha konuşkan olacak. Bu arada, bu yeni gölgelendiriciyi koyduğumda sıralama katmanım patladı. Ztest ve Zwrite'i kapatmaya çalıştım ama işe yaramıyor. Yani (Ama asıl sorun değil)

Shader "Unlit/SimpleUnlitTexturedShader" 
{ 
    Properties 
    { 
     // we have removed support for texture tiling/offset, 
     // so make them not be displayed in material inspector 
     [NoScaleOffset] _MainTex("Texture", 2D) = "white" {} 
     _Position("Position", Vector) = (0,0,0,0) 
    } 
     SubShader 
    { 
     Pass 
    { 
     CGPROGRAM 
     // use "vert" function as the vertex shader 
#pragma vertex vert 
     // use "frag" function as the pixel (fragment) shader 
#pragma fragment frag 

     // vertex shader inputs 
    struct appdata 
    { 
     float4 vertex : POSITION; // vertex position 
     float2 uv : TEXCOORD0; // texture coordinate 

    }; 

    // vertex shader outputs ("vertex to fragment") 
    struct v2f 
    { 
     float2 uv : TEXCOORD0; // texture coordinate 
     float4 vertex : SV_POSITION; // clip space position 
     float3 worldpos:WD_POSITION; 
    }; 

    // vertex shader 
    v2f vert(appdata v) 
    { 
     v2f o; 
     // transform position to clip space 
     // (multiply with model*view*projection matrix) 
     o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
     // just pass the texture coordinate 
     o.uv = v.uv; 
     o.worldpos= mul(_Object2World,o.vertex).xyz; 
     return o; 
    } 

    // texture we will sample 
    sampler2D _MainTex; 
    float4 Position ; 
    // pixel shader; returns low precision ("fixed4" type) 
    // color ("SV_Target" semantic) 
    fixed4 frag(v2f i) : SV_Target 
    { 
     // sample texture and return it 
     fixed4 col = tex2D(_MainTex, i.uv); 
    col.a = step(2,distance(Position.xyz, i.worldpos)); 
    return col; 
    } 
     ENDCG 
    } 
    } 
} 

cevap

0

geometride "kesme delikleri" etkisi tepe tarayıcısı kullanılarak elde edilebilir bir fikrin varsa. Bu, vertex gölgelendiriciler _Object2World matrisini kullanarak bir nesnenin bir pikselinin 3d dünya konumunu belirlemenize izin verdiğinden mümkündür. Telefonumda olmasaydım, bir kod örneği verirdim, ama bunu açıklamaya çalışacağım. Eğer köşe pozisyonunu alırsanız, bir _Object2World matrisini uygulayın, 3d dünya pozisyonuna dönecektir. İşte hızlı bir örnek: float3 worldPos = mul (_Object2World, v.vertex) .xyz; Gölgelendiricinin bölüm bölümünde, saydamlığı, worldPos ve diğer herhangi bir konum arasındaki mesafeye göre ayarlayabilirsiniz. Bunu takip etmek hala zorsa özür dilerim, bunu şu anda telefonumda yapmaya çalışıyorum. Söylediğim şey hakkında ayrıntılı bilgi vermek veya kod örneği vermek isteyen biri varsa. Aksi takdirde, bu noktada vertex shaders üzerinde çalışabilirsiniz: http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

Bu yardımcı olur!

+0

Şu an bazı Görüntü Efektleri Shader ile çalışıyorum. önce, yüzey gölgelendirici üzerinde çalışıyordum, gerçekten bir fark olup olmadığını bilmiyorum. Ama şimdilik, ben dokudaki gölgelendiricimde 'v2f dikey (appdata v) \t ( \t \t v2f o; \t \t o.vertex = mul (UNITY_MATRIX_MVP, v.vertex); \t \t o.uv = v.uv; \t \t o; N0: \t sampler2D _MainTex; (I V2F) \t fixed4 kırılgan: SV_Target \t { \t \t fixed4 sut; \t col.rgb = tex2D (_MainTex, i.uv) .rgb; \t // sadece renkleri ters çevirin \t return col; } Ancak grafiğim hala beyaz. Bir sonraki adım, vert işlevinde WorldPos yaratmayı anladığım ve bir sonraki işlevini kullanacağım gibi olmalıdır. –