2016-03-27 11 views
1

Unityマニュアルからthis oneに似たシェーダをコーディングしようとしています。これは、Clip()関数を使ってほぼ水平なリング内のピクセルを破棄してオブジェクトを "スライス"します。Unity worldPos相対方向

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

水平線ではなく、任意の角度でスライスできます。これは、しかし、2つの問題がある

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

:私はworldPos Zの乗数が実際のスライスの角度を変えないので、私はそれにプロパティ変数を設定することを(私はシェーダをコーディングする新たなんだので)実験を通して発見しました。 1)1.0までの値は、45度までの線を回転させますが、線を越えて "すみません"になり、きちんとした線よりむしろあらゆる種類のパターンに畳み込まれます.2)顔が正の方向または負のX軸。 Zを向いているとき、線は移動せず、Yに面するときには大きくなりますが回転しません。似たような状況をしかし、予想通り 1)任意の角度を達成する方法ではなくX.

すべてのアイデアは、よりZで働く -

IN.worldPos.xからIN.worldPos.yは、あなたが期待するかもしれないものを変更しますか? 2)向きが向いているかどうかにかかわらず作業しますか?

私はworlPosを使用しています。なぜなら、画面のスペースではなくオブジェクトに対する相対的な線を常に必要としているからです。別の方法がありますか?私の実際のシェーダはサーフェスシェーダではなくフラグメントです&私はワールドポスをvertからfragに渡しています。あなたは内積を使用して法線ベクトルとクリップを使って平面を定義することができます任意の角度を取得するために

感謝

+0

dat hard hard ... – Fattie

答えて

0

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

ここで法線ベクトルが長いほど、スライスが多くなります。

スライスをオブジェクトに関連させる場合は、worldPos以外の座標セットを使用する必要があります。可能であれば、この回答は役に立ちます:http://answers.unity3d.com/questions/561900/get-local-position-in-surface-shader.html