2016-03-21 11 views
0

私は現在、キャラクターがバックグラウンドで移動できるゲームを開発中です。このキャラクターがこの背景を掘り起こすという考えがあります。私はそれがシェイダーによって行われるべきだと思うが、私はその初心者です。 。シェイダーでスプライトに穴を作るUnity 2d

キャラクターがこのピクセルの位置から離れすぎているように見えるので、このピクセルのアルファは0です。アルファを0に保つためにアルファが0に等しい場合は、文字のテストをする。

しかし、今のところ、スプライト/拡散シェーダをベースとして試してみましたが、ピクセルの位置を取得する方法が見つかりませんでした。私はsurf関数で何かを試しましたが、実際の結果はありませんsurf関数はpixel noで1回実行されるはずです。

ありがとうございました。

編集 私は最終的にvert fragシェーダを得るためにいくつかのことを試みました。私が言ったように、私はピクセルの距離でアルファを計算しようとしています。 今のところ私のミスはどこにあるのか分かりませんが、多少の話が出るかもしれません。ところで、この新しいシェーダを置くと、私のソートレイヤーが爆発してしまいました。私はZtestとZwriteをオフにしようとしましたが、うまくいきません。だから、あなたは(しかし、それは主要な問題ではありません)

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 
    } 
    } 
} 

答えて

0

幾何学における「切削穴」の効果は、頂点シェーダを使用して達成することができる任意のアイデアを持っている場合。これは、頂点シェーダが_Object2Worldマトリックスを使用してオブジェクトのピクセルの3次元ワールド位置を決定できるので可能です。私が自分の電話機にいなかったら、コード例を挙げたいが、それを記述しようとするだろう。頂点位置を取って_Object2World行列を適用すると、3次元の世界座標が返されます。ここに簡単な例があります: float3 worldPos = mul(_Object2World、v.vertex).xyz; シェーダのフラグメント部分では、worldPosと他の位置の間の距離に基づいて透明度を設定できます。私はこれがまだ難しい場合はお詫びします、私は今私の電話でこれをやろうとしています。もし誰かが私が言ったことを詳述したいと思っていたり、コード例があれば素晴らしいだろう。そうでなければ、ここで頂点シェーダを調べることができます: http://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

+0

私は現在、いくつかのImage Effect Shaderを使っています。前に、私は表面シェーダーで作業していましたが、違いがあるかどうかは分かりません。しかし、今のところ、シェーダにテクスチャが表示されるようにしてください。 'v2f vert(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 return o; \t} \t sampler2D _MainTex; \t fixed4frag(v2f i):SV_Target \t { \t \t fixed4 col; \t col.rgb = tex2D(_MainTex、i.uv).rgb; \t //色を反転するだけです \t return col; \t} ' 私のスプライトは白のままです。私の次のステップは、私がvert関数でWorldPosを作成し、それを次のfunct –