2013-04-26 8 views
5

Ich bin mit einem Text Netz Text auf einem 3D-Objekt zu platzieren, aber wie Sie alle wissen, wird das Text-Netz hat noch keine Normalen ...Wie kann ich ein normales Textgitter so hinzufügen, dass es richtig leuchtet?

http://docs.unity3d.com/Documentation/Components/class-TextMesh.html

... so ist es nicht der Fall ist Licht richtig. Ich habe eine Suche durchgeführt und viele Leute gefunden, die Probleme mit der Beleuchtung von 3D-Text haben, weil es keine Normalen hat, aber ich habe keine Lösung gefunden, um Normalen zu einem Text-Mesh-Objekt hinzuzufügen, das ist meine Frage.

Wie kann ich ein normales Textgitter so hinzufügen, dass es richtig leuchtet?

Vielen Dank im Voraus für Ihre Weisheit!

+0

Ich denke, normale hängt auf das Material und Shader verwendet werden. Weiß nicht ob es auf Maschen ankommt oder nicht. Versuchen Sie, den Shader in etwas zu ändern, das normales, wie spiegelndes – noob

+0

@Creator erlaubt. Ein Normal ist nur ein Vektor ungleich Null, der orthogonal zur Fläche eines Poly im Mesh ist. Es wird von den Shadern verwendet, um die Beleuchtung zu rendern. Die Shader, die ich verwenden muss, verlassen sich auf Normalen, die für das Netz definiert sind, das angezündet wird. In diesem Fall wird der Text mesh. Das Problem ist, dass das Mesh keine Normalen hat. So wird der Text unabhängig von der Umgebung, in der er sich befindet, immer als durchgehend weiße Farbe dargestellt. – BeachRunnerFred

+0

Gibt es einen Grund, warum Sie Text Mesh und kein aus einer 3D-Software hergestelltes Netz verwenden? Ich nehme an, dass Sie planen, den Text zur Laufzeit zu ändern? – LightStriker

Antwort

6

Ich tat etwas ähnliches für die Beleuchtung einer 3D-Textur. Ich hoffe, meine Antwort ist nicht übertrieben. Dieser Code war also ein Hack, den ich vor einiger Zeit geschrieben habe, er ist ineffizient und unterstützt nur ein einzelnes gerichtetes Licht (hilfreich cg lighting tuts here). Hoffentlich ist das genug, um Sie zu beginnen.

Um eine 3D-Textur mit meinem Code erstellen unter Ihnen durch ein wenig mehr Arbeit gehen:

  1. Erstellen Sie ein leeres Spielobjekt
  2. Attach Komponenten-> Mesh-> Text Netz
  3. Attach Komponente TextMeshNormals (im Lieferumfang unten)
  4. Attach Komponenten-> Mesh-> Mesh Renderer
  5. zuweisen eines Materials zu dem Mesh-Renderer, die meine GUI verwendet/LitText Shader unter

Im Shader werden Sie ein Text-normal-Attribut bemerken. In der Praxis würde die Methode update() Ihres gameObject die Eigenschaft _Normal mit der Richtung, in die der Text zeigt, aktualisieren, so dass sie eine Änderung der Ausrichtung widerspiegelt. Der Text ist eben, also brauchen wir nur 1 Normal. Um zu testen, setze ich die Normale auf (0,0, -1,1), da das Standardtextgitter nach unten auf -Z steht.

Da dieses Skript nicht im Editor ausgeführt wird, wird Ihr Text erst angezeigt, wenn Sie eine Szene in der Vorschau ausführen.

Der Shader:

Shader "GUI/LitText" { 
Properties { 
    _MainTex ("Font Texture", 2D) = "white" {} 
    _Color ("Text Color", Color) = (1,1,1,1) 
    _Normal ("Text Normal",Vector) = (0,0,0,1) 
} 

SubShader { 
    Blend SrcAlpha OneMinusSrcAlpha 
    Pass { 
     Color [_Color] 
     SetTexture [_MainTex] { 
      combine primary, texture * primary 
     } 
    } 
    pass { 
     Tags { "LightMode" = "ForwardBase" } 

     CGPROGRAM 

     #pragma vertex vert 
     #pragma fragment frag 

     uniform sampler2D _MainTex; 
     uniform float4 _Color; // define shader property for shaders 
     uniform float4 _Normal; 

     // The following built-in uniforms (apart from _LightColor0) 
     // are defined in "UnityCG.cginc", which could be #included 
     uniform float4 unity_Scale; // w = 1/scale; see _World2Object 
     uniform float3 _WorldSpaceCameraPos; 
     uniform float4x4 _Object2World; // model matrix 
     uniform float4x4 _World2Object; // inverse model matrix 
      // (all but the bottom-right element have to be scaled 
      // with unity_Scale.w if scaling is important) 
     uniform float4 _WorldSpaceLightPos0; 
      // position or direction of light source 
     uniform float4 _LightColor0; 
      // color of light source (from "Lighting.cginc") 

     struct vertexInput { 
      float4 vertex : POSITION; 
      float3 normal : NORMAL; 
      float4 texcoord : TEXCOORD0; 
     }; 
     struct vertexOutput { 
      float4 pos : SV_POSITION; 
      float4 col : COLOR; 
      float4 tex : TEXCOORD0; 
     }; 

     vertexOutput vert(vertexInput input) 
     { 
      vertexOutput output; 

      float4x4 modelMatrix = _Object2World; 
      float4x4 modelMatrixInverse = _World2Object; 

      float3 normalDirection = normalize(float3(mul(_Normal, modelMatrixInverse))); 
      float3 lightDirection = normalize(float3(_WorldSpaceLightPos0)); 

      float3 diffuseReflection = float3(_LightColor0) * float3(_Color) 
       * max(0.0, dot(normalDirection, lightDirection)); 

      output.col = float4(diffuseReflection, 1.0); 
      output.pos = mul(UNITY_MATRIX_MVP, input.vertex); 
      output.tex = input.texcoord; 
      return output; 
     } 

     float4 frag(vertexOutput input) : COLOR 
     { 
      half4 color = tex2D(_MainTex, float2(input.tex)); 
      // use color.a to get alpha from text texture, rgb comes from vertex shader       
      return float4(input.col.r,input.col.g,input.col.b,color.a); 
     } 

     ENDCG 
    } 
} 
} 

Und das Hilfsskript:

public class TextMeshNormals : MonoBehaviour { 
    private TextMesh textMesh; 

    // Use this for initialization 
    void Start() { 
     // reassign font texture to our material 
     textMesh = transform.GetComponent<TextMesh>(); 
     renderer.material.mainTexture = textMesh.font.material.mainTexture; 
    } 
} 

aktualisieren Unity 4.5.x diese leicht aktualisierte Version verwenden:

Shader "GUI/LitText" { 
Properties { 
    _MainTex ("Font Texture", 2D) = "white" {} 
    _Color ("Text Color", Color) = (1,1,1,1) 
    _Normal ("Text Normal",Vector) = (0,0,0,1) 
} 

SubShader { 
    Blend SrcAlpha OneMinusSrcAlpha 
    Pass { 
     Color [_Color] 
     SetTexture [_MainTex] { 
      combine primary, texture * primary 
     } 
    } 
    pass { 
     Tags { "LightMode" = "ForwardBase" } 

     CGPROGRAM 

     #pragma vertex vert 
     #pragma fragment frag 

     uniform sampler2D _MainTex; 
     uniform float4 _Color; // define shader property for shaders 
     uniform float4 _Normal; 
     uniform float4 _LightColor0; 
      // color of light source (from "Lighting.cginc") 
     struct vertexInput { 
      float4 vertex : POSITION; 
      float3 normal : NORMAL; 
      float4 texcoord : TEXCOORD0; 
     }; 
     struct vertexOutput { 
      float4 pos : SV_POSITION; 
      float4 col : COLOR; 
      float4 tex : TEXCOORD0; 
     }; 

     vertexOutput vert(vertexInput input) 
     { 
      vertexOutput output; 

      float4x4 modelMatrix = _Object2World; 
      float4x4 modelMatrixInverse = _World2Object; 

      float3 normalDirection = normalize(float3(mul(_Normal, modelMatrixInverse))); 
      float3 lightDirection = normalize(float3(_WorldSpaceLightPos0)); 

      float3 diffuseReflection = float3(_LightColor0) * float3(_Color) 
       * max(0.0, dot(normalDirection, lightDirection)); 

      output.col = float4(diffuseReflection, 1.0); 
      output.pos = mul(UNITY_MATRIX_MVP, input.vertex); 
      output.tex = input.texcoord; 
      return output; 
     } 

     float4 frag(vertexOutput input) : COLOR 
     { 
      half4 color = tex2D(_MainTex, float2(input.tex)); 
      // use color.a to get alpha from text texture, rgb comes from vertex shader       
      return float4(input.col.r,input.col.g,input.col.b,color.a); 
     } 

     ENDCG 
    } 
} 
} 
+0

+1: nette Lösung. Muss die TextMesh-Komponente deaktiviert werden? Da scheint es, dass nun TextMeshNormals für das Rendern des Textes zuständig ist. – Heisenbug

+0

@Heisenbug Nette Idee, ich hatte nicht gedacht, zu überprüfen. Nach dem Betrachten des Codes bin ich mir nicht sicher, ob TextMesh deaktiviert werden kann. Es scheint sich um eine reine Komponente ohne aktiviertes Mitglied zu handeln. – Jerdak

+0

Danke, @ Jerdak, das ist sehr hilfreich! Ich versuche es mal. – BeachRunnerFred

Verwandte Themen