【发布时间】:2019-09-22 21:32:42
【问题描述】:
我正在尝试创建一个允许在网格上映射文本的着色器。如何水平对齐每个字符?目前,它们都相互重叠。
目前看起来像这样:
使用的纹理:
Shader "Unlit/MapText"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_FontTex("FontTexture", 2D) = "white" {}
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform int _CharacterCount;
uniform float4 _Characters[3];
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float2 uv1 : TEXCOORD1;
};
struct v2f
{
float2 uv : TEXCOORD0;
float2 uv1 : TEXCOORD1;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _FontTex;
float4 _FontTex_ST;
float4 _Color;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv1 = TRANSFORM_TEX(v.uv1, _FontTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 col;
_Characters[0] = 0;
_Characters[1] = 1;
_Characters[2] = 2;
for (uint k = 0; k < _Characters.Length; k++)
{
float row = (k % 1024);
float column = (k / 1024);
float2 character = (i.uv1 + float2(row, column)) * 0.33;
_Characters[k] = tex2D(_FontTex, character);
}
col = (_Characters[0] + _Characters[1] + _Characters[2]) * _Color;
return col;
}
ENDCG
}
}
}
【问题讨论】:
-
您不使用 TextMeshPro 的任何原因?
-
是的,我稍后需要在蒙皮网格上使用它,而普通网格上的 afaik TMPro 不会弯曲。会吗?
-
this 之类的内容对您有帮助吗?
-
@derHugo 这个方法很有趣,但问题是我需要在场景中的大约 10-15 个对象上有动态文本,因此我需要很多相机、渲染纹理和图层,这需要在移动设备上运行。
-
@derHugo 这会是性能问题吗?
标签: unity3d shader fragment-shader vertex-shader shaderlab