曾经写过一篇关于精灵轮廓处理的文章. 游戏中对精灵做实时的边缘alpha平滑绝对是对美工作图的不足,而在精灵轮廓线上留下锯齿, 或黑(白)边,的一种弥补. 但是, 如何获得精灵的带 Alpha 级轮廓线的确是值得商榷的地方.
上次提到的一个简单的方法是将精灵缩小到 1/4, 以此来获得额外的信息. 效果是不错, 但单单为了获得轮廓线而将所有的图象都作到 4 倍大, 无疑是一种浪费; 而另一种合适的方法是, 3D MAX 渲染的图片同时可以得到一张 Alpha 通道位图, 从里面获得需要的信息; 又或者从其他 带有 Alpha 通道的位图格式(比如 .PSD) 中取得.
本文不分析那些复杂的位图格式, 这里给出一个简洁的算法可以基本满足获取精灵轮廓线的需要.
1 | 1 | 1 |
1 | 8 | 1 |
1 | 1 | 1 |
附过滤程序: (需要风魂) #include "windsoul.h" BMP *bmp; void blue(BMP *b) { int i,j,c; c=b->line[0][0]; for (i=0;i<b->h;i++) for (j=0;j<b->w;j++) if (b->line[i][j]!=c) b->line[i][j]=0x1f; else b->line[i][j]=0; } void blur(BMP *b) { int i,j,red=0,green=0,blue; for (i=0;i<b->h-3;i++) for (j=0;j<b->w-3;j++) b->line[i+1][j+1]=(8*b->line[i+1][j+1]+ b->line[i][j]+ b->line[i][j+1]+ b->line[i][j+2]+ b->line[i+1][j]+ b->line[i+1][j+2]+ b->line[i+2][j]+ b->line[i+2][j+1]+ b->line[i+2][j+2])/16; } int wsInit() { bmp=load_bmp("sprite.bmp"); blue(bmp); blur(bmp); save_bmp(bmp,"blur.bmp"); clear_bitmap_ex(screen,0); return 0; } int wsMain() { draw_sprite(screen,bmp,0,0); update_screen(); return 0; } void wsExit() { destroy_bitmap(bmp); }