2013-05-07 104 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