- 3D-. , . , , , ( cg ). , , .
3D-, , :
- - > Mesh- >
- TextMeshNormals (. )
- - > Mesh- > Mesh Renderer
- Mesh Renderer, GUI/LitText
. gameObject Update() _Normal , , . , 1 - , . (0,0, -1,1), -Z.
script , , .
:
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
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
}
}
}
script:
public class TextMeshNormals : MonoBehaviour {
private TextMesh textMesh;
void Start () {
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
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
}
}
}