【小松教你手游开发】【unity实用技能】NGUI字体描边
2016-11-19 17:15
711 查看
http://gad.qq.com/article/detail/7172155
NGUI的UILabel中实现字体的描边是通过以方形的方式对字体网格顶点偏移一定位置后作为其描边网格。以这种方式描边在边角处会生硬,描边不均匀问题,特别是在比较大的字体描边时偏移越大这种生硬,不均匀程度越明显。处理这种描边一可以通过改进shader的方式来做调整,这里我介绍林一种新的方式:以圆形方式对字体网格顶点偏移一定位置后作为其描边网格。
具体修改是将UILabel 中的OnFill方法中:
// Apply an effect if one was requested
if (effectStyle != Effect.None)
{
int end = verts.size;
pos.x = mEffectDistance.x;
pos.y = mEffectDistance.y;
ApplyShadow(verts, uvs, cols, offset, end, pos.x, -pos.y);
if (effectStyle == Effect.Outline)
{
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, -pos.x, pos.y);
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, pos.x, pos.y);
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, -pos.x, -pos.y);
}
}
替换为如下代码:
// Apply an effect if one was requested
if (effectStyle != Effect.None)
{
int end = verts.size;
pos.x = mEffectDistance.x;
pos.y = mEffectDistance.y;
if (effectStyle != Effect.Outline)
ApplyShadow (verts, uvs, cols, offset, end, pos.x, -pos.y);
else {
float arcLength = 1.4142f ;
float dr = 1f;
float r = pos.x;
float radian = arcLength / r ;
float tempR = 0;
while(tempR < r){
int count = (int)Math.Floor(Math.PI * 2 /radian);
float i = 0;
while (i < count) {
float angle = radian * i;
float x = tempR * (float)Math.Cos ((double)angle);
float y = tempR * (float)Math.Sin ((double)angle);
ApplyShadow (verts, uvs, cols, offset, end, x, y);
offset = end;
end = verts.size;
++i;
}
tempR += dr;
}
}
}
最后的效果对比如下:
图一(调整后的效果)
图二(调整前的效果)
圆形拓展网格对比方形扩展网格缺点就是圆形拓展方式获得新网格会比矩形多,具体增加的量与描边偏移量有一定关系,同时目前暂时不支持x和y的不同偏移,只支持x与y的统一偏移量。
NGUI的UILabel中实现字体的描边是通过以方形的方式对字体网格顶点偏移一定位置后作为其描边网格。以这种方式描边在边角处会生硬,描边不均匀问题,特别是在比较大的字体描边时偏移越大这种生硬,不均匀程度越明显。处理这种描边一可以通过改进shader的方式来做调整,这里我介绍林一种新的方式:以圆形方式对字体网格顶点偏移一定位置后作为其描边网格。
具体修改是将UILabel 中的OnFill方法中:
// Apply an effect if one was requested
if (effectStyle != Effect.None)
{
int end = verts.size;
pos.x = mEffectDistance.x;
pos.y = mEffectDistance.y;
ApplyShadow(verts, uvs, cols, offset, end, pos.x, -pos.y);
if (effectStyle == Effect.Outline)
{
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, -pos.x, pos.y);
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, pos.x, pos.y);
offset = end;
end = verts.size;
ApplyShadow(verts, uvs, cols, offset, end, -pos.x, -pos.y);
}
}
替换为如下代码:
// Apply an effect if one was requested
if (effectStyle != Effect.None)
{
int end = verts.size;
pos.x = mEffectDistance.x;
pos.y = mEffectDistance.y;
if (effectStyle != Effect.Outline)
ApplyShadow (verts, uvs, cols, offset, end, pos.x, -pos.y);
else {
float arcLength = 1.4142f ;
float dr = 1f;
float r = pos.x;
float radian = arcLength / r ;
float tempR = 0;
while(tempR < r){
int count = (int)Math.Floor(Math.PI * 2 /radian);
float i = 0;
while (i < count) {
float angle = radian * i;
float x = tempR * (float)Math.Cos ((double)angle);
float y = tempR * (float)Math.Sin ((double)angle);
ApplyShadow (verts, uvs, cols, offset, end, x, y);
offset = end;
end = verts.size;
++i;
}
tempR += dr;
}
}
}
最后的效果对比如下:
图一(调整后的效果)
图二(调整前的效果)
圆形拓展网格对比方形扩展网格缺点就是圆形拓展方式获得新网格会比矩形多,具体增加的量与描边偏移量有一定关系,同时目前暂时不支持x和y的不同偏移,只支持x与y的统一偏移量。
相关文章推荐
- 【小松教你手游开发】【unity实用技能】NGUI字体描边
- 【小松教你手游开发】【unity实用技能】NGUI Scrollview的Reposition的几个总结
- 【小松教你手游开发】【unity实用技能】一键改变UI字体
- 【小松教你手游开发】【unity实用技能】Unity3D_NGUI_性能优化实践_CPU卡顿
- 【小松教你手游开发】【unity实用技能】unity ngui wp8上使用动态字体消失或碎片化的问
- 【小松教你手游开发】【unity实用技能】NGUI Scrollview的Reposition的几个
- 【小松教你手游开发】【unity实用技能】NGUI 自动适配屏幕大小
- 【小松教你手游开发】【unity实用技能】从NGUI的UIScrollview的实现原理延伸到ngui的层次,合并,drawcall生成原理
- 【小松教你手游开发】【unity实用技能】一键改变UI字体
- 【小松教你手游开发】【unity实用技能】Unity3D_NGUI_性能优化实践_CPU卡顿
- 【小松教你手游开发】【unity实用技能】控制renderQueue解决NGUI与Unity3D物体渲染顺序问题
- 【小松教你手游开发】【unity实用技能】从NGUI的UIScrollview的实现原理
- 【小松教你手游开发】【unity实用技能】角色头部跟随镜头旋转
- 【小松教你手游开发】【unity实用技能】Unity图片变灰的方式
- 【小松教你手游开发】【unity实用技能】u3d 获取屏幕的宽高
- 【小松教你手游开发】【unity实用技能】unity自带寻路Navmesh入门教程
- 【小松教你手游开发】【unity实用技能】给每个GameObject的打开关闭加上一个渐变
- 【小松教你手游开发】【unity实用技能】unity发包优化(android一键发包)
- 【小松教你手游开发】【unity实用技能】内存调试方法
- 【小松教你手游开发】【unity实用技能】对象的简单平移与旋转