2013-05-07 103 views
3

我正在嘗試編寫僅適用於某些頂點的頂點着色器。僅用於某些頂點的頂點着色器

在Unity中,文本呈現爲一系列不連貫的4頂點多邊形。 我試圖轉換/旋轉/縮放這些多邊形,但是分開。 所以我可以獨立移動每個字母。

我不認爲這是可能的,但如果每個頂點有一個ID,我可以將它們分組0-3,4-7等,並以這種方式移動它們。

是否有任何技巧來修改頂點取決於他們附加什麼,或者他們是哪個「數字」?

+1

請使用unity3d標記來表示該事物。統一標籤用於Microsoft Unity。 – 2013-05-07 09:44:22

+1

我的不好,我從來沒有聽說過MS Unity :)我將來會使用unity3d。 – 2013-05-07 09:52:51

回答

2

我不相信你可以直接這樣做,但你可以使用第二個UV頻道來存儲你的ID。

這是一個重新定義的Unity normal shading example使用「頂點ID」來確定何時應用法線作爲顏色。

Shader "Custom/ColorIdentity" { 
Properties { 
    //_MainTex ("Base (RGB)", 2D) = "white" {} 
} 
SubShader { 
    Pass { 
     CGPROGRAM 
      #pragma vertex vert 
      #pragma fragment frag 

      struct appdata { 
       float4 vertex : SV_POSITION; 
       float3 normal : NORMAL; 
       float4 texCoord2 : TEXCOORD1; 
      }; 
      struct v2f { 
       float4 pos : SV_POSITION; 
       float3 color : COLOR0; 
      }; 

      v2f vert (appdata v) 
      { 
       v2f o; 

       //here is where I read the vertex id, in texCoord2[0] 
       //in this case I'm binning all values > 1 to id 1, else id 0 
       //that way they can by multiplied against to the vertex normal 
       //to turn color on and off. 
       int vID = (v.texCoord2[0]>1)?1:0; 

       o.pos = mul (UNITY_MATRIX_MVP, v.vertex); 
       o.color = v.normal * vID; //Use normal as color for vertices w/ ids>1 
       return o; 
      } 

      half4 frag (v2f i) : COLOR 
      { 
       return half4 (i.color, 1); 
      } 
     ENDCG 
    } 
} 
Fallback "Diffuse" 
} 

此外,這裏是僞裝的腳本,我分配完全任意的ID。 ID是根據y軸上頂點的位置分配的。根據我得到的網格,隨機選擇邊界:

public class AssignIdentity : MonoBehaviour { 
public GameObject LiveObject; 

// Use this for initialization 
void Start() { 
    Mesh mesh = LiveObject.GetComponent<MeshFilter>().mesh; 
    Vector3[] vertices = mesh.vertices; 
    Vector2[] uv2s = new Vector2[vertices.Length]; 

    int i = 0; 
    foreach(Vector3 v in vertices){ 
     if(v.y>9.0f || v.y < 4.0){ 
      uv2s[i++] = new Vector2(2,0); 
     } else { 
      uv2s[i++] = new Vector2(1,0); 
     } 
    } 
    mesh.uv2 = uv2s; 
} 
} 
+2

+1爲好建議。順便說一句,如果他需要轉換每個字母獨立於其他人,他不能簡單地爲每個字母創建一個文本網格? – Heisenbug 2013-05-07 20:18:08

+0

@Heisenbug哦好吧,走輕鬆的路線。 :)但是,是的,你提出了一個很好的觀點。最簡單的解決方案是使每個字母都是自己的文本網格。 – Jerdak 2013-05-07 20:30:45

+1

@Heisenbug我曾經想到過,但它不會破解嗎?必須有一種方法來獲得文本網格下的多邊形... – 2013-05-08 08:26:33