在玩很多flash网页游戏的时候,看到它们都有非常清晰的宋体字,并且有漂亮的描边效果。如图,这是战将传奇的登录界面中的文字。
对比之下,silverlight要弄文字可让人头痛无比,别的不说,默认的字体怎么看怎么歪瓜裂枣。我就不贴图了,大家都明白。
那么怎么办捏,我们要祭出法宝:像素着色器!
1 sampler2D input : register(s0); //输入的textblock
2
3 float w:register(C0); //宽度
4
5 float h:register(C1); //高度
6
7 float4 fontcolor:register(C2); //字体颜色
8
9 float4 bordercolor:register(C3); //描边颜色
10
11 float4 main(float2 uv : TEXCOORD) : COLOR
12 {
13 //float3 rgb= bordercolor.rgb ;
14
15 float4 Color;
16 Color= tex2D( input , uv.xy); //提取当前像素颜色
17
18 int i;
19
20
21 for( i=1;i<2;i++ ) //修改此循环,可以改动描边的宽度,不过,这里就1次就够了
22 {
23 if( Color.a==0 )
24 {
25 float4 c2;
26 c2= tex2D( input, uv.xy +float2 (0,i/h) ); //提取下方像素
27
28 if( c2.a>0 )
29 {
30 Color=bordercolor; //描边
31 }
32 else
33 {
34 c2= tex2D( input, uv.xy +float2 (0,-i/h) ); //提取上方像素 。。。如此这般,共提取4次。
35 if( c2.a>0 )
36 {
37 Color=bordercolor;
38 }
39 else
40 {
41 c2= tex2D( input, uv.xy +float2 (i/w,0) );
42 if( c2.a>0 )
43 {
44 Color=bordercolor;
45 }
46 else
47 {
48 c2= tex2D( input, uv.xy +float2 (-i/w,0) );
49 if( c2.a>0 )
50 {
51 Color=bordercolor;
52 }
53 }
54 }
55 }
56 }
57 else
58 {
59 float4 tempcolor = fontcolor;
60
61
62 if( Color.a<0.1) //由于SL对字体的反锯齿处理,这里有一个非常讨厌的现象:有半透明像素存在,经过测试,如果透明度在0.1一下,则判断为边,否则为字。
63 {
64 tempcolor=bordercolor;
65 }
66
67 Color=tempcolor;
68 }
69 }
70
71
72
73 return Color;
74 }
75
然后,按照深蓝的教程,将着色器代码转为Effect,即可使用。效果如下,哈哈,和flash是一模一样的吧