5

テキスト メッシュを使用して 3D オブジェクトにテキストを配置していますが、ご存知のように、テキスト メッシュには法線がありません...

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

...だから、正しく点灯しません。検索を行ったところ、法線がないために 3D テキスト メッシュのライティングに問題を抱えている多くの人が見つかりましたが、テキスト メッシュ オブジェクトに法線を追加する解決策が見つからなかったので、それが私の質問です。

テキスト メッシュに法線を追加して、正しく点灯させるにはどうすればよいですか?

あなたの知恵を前もってどうもありがとう!

4

1 に答える 1

6

3D テクスチャを照らすために似たようなことをしました。私の答えがやり過ぎではないことを願っています。したがって、このコードは私がしばらく前に書いたハックであり、非効率的であり、単一の指向性ライトしかサポートしていません (便利な cg lighting tuts here )。うまくいけば、これで十分です。

以下のコードを使用して 3D テクスチャを作成するには、もう少し作業が必要です。

  1. 空のゲーム オブジェクトを作成する
  2. アタッチ コンポーネント -> メッシュ -> テキスト メッシュ
  3. コンポーネント TextMeshNormals をアタッチ (以下に含まれる)
  4. アタッチ コンポーネント -> メッシュ -> メッシュ レンダラー
  5. 以下の GUI/LitText シェーダーを使用するメッシュ レンダラーにマテリアルを割り当てます

シェーダーでは、テキスト法線アトリビュートに気付くでしょう。実際には、gameObject の Update() メソッド_Normalで、テキストが向いている方向でプロパティを更新し、向きの変化を反映するようにします。テキストは平面なので、必要な法線は 1 つだけです。テストするために、デフォルトのテキスト メッシュが -Z を下に向けているため、手動で法線を (0,0,-1,1) に設定しました。

このスクリプトはエディターで実行されないため、プレビューでシーンを実行するまでテキストは表示されません。

シェーダー:

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

そしてヘルパースクリプト:

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

Unity 4.5.X を更新して、このわずかに更新されたバージョンを使用します

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
    }
}
}
于 2013-04-27T05:53:13.447 に答える