阅读:2550回复:0
反走样矢量绘制
<h2><br></h2>经过2个多月零零碎碎的努力,痛苦的查阅了无数篇关于反走样方面的英文文章,从开始对图形学一无所知,到现在终于小有所成,搞定了多边形的反走样绘制,恩,谈谈心得吧<br>
最开始,搜到了一个比较廉价的反走样算法:WU-LINE.WU-LINE是绘制反走样直线的,那怎么用它来绘制反走样多边形呢?我是这 样实现的:先画出一个锯齿多边形,然后用WU-LINE勾一下边,就达到了反走样的效果.不过我发现这个方法有很多缺陷,比如:如果用这种方法画一个圆的 话,效果那真是惨不忍睹;再比如:绘制一个12PT的TRUETYPE文字的话,这个WULINE会将线宽加宽,因为12PT的文字本身就很小,线宽一加 宽,绘制的文字也很惨不忍睹.这个方法只能用于一些特定的多边形绘制,貌似IGO myway用的就是这种方法,它的道路勾边的反走样效果很像WU-LINE,你可以在IGO里随便找一个2种颜色的道路相交的地方,IGO里只对道路的边 缘进行了勾边反走样,但相交的地方它没有,仔细看的话,可以发现锯齿,不过,这只是我的猜测而已,不管怎么说,这种方法在某些方面还是很有效果的,而且它 速度也很快.<br> 当然,这种方法我觉得还是不能满足,实现像AGG那样漂亮的反走样效果才是我的最终目的,不过,当然,AGG是开源的,有人肯定会说,为 什么不把它的源代码拿过来看看,看懂了然后照着葫芦画瓢不就行了.很明显,AGG的代码我要是看得懂的话............虽然看不懂AGG的代 码,但我还是搞清楚了AGG使用的是亚像素精度法.其实我也不知道我有没有搞清楚,因为没有高人告诉怎么是对的,怎么是错的.不过从结果来看,我应该是搞 清楚了......说错了请大家不要怪我......<br> 先说说反走样的原理吧:<br> 例:一个4边形:A(0, 0),B(1, 0),C(1, 0.5),D(0, 0.5),这个4边形只落在了一个像素上,而且只占据了1/2个像素,如果用锯齿多边形算法去绘制这个点的话,要么就是什么都没有,要么就是只画了一个 点,这个点的颜色值就是这个多边形的颜色值.如果用反走样多边形算法去绘制的话,最后绘制这个点的时候,就多了一个影响它颜色的信息:ALPHA值,为 0.5;然后根据这个ALPHA值去最终确定这个点的颜色值.那么这个ALPHA值是怎么来的呢?其实ALPHA值就是这个像素内多边形的面积.那么如何 反走样呢?就是计算出一个多边形所有的边所经过的每个像素,然后再计算每个像素中有多少面积是落在多边形内的,通过面积得到像素的ALPHA值,最后算出 像素的颜色值,就反走样了.....<br> AGG使用的亚像素精度法也就是一种计算像素中有多少面积是落在多边形内的一种方法,原理就是把一个像素分成N*N个小像素,然后计算有 多少个小像素落在多边形中,从而得出近似面积.但是,本人才疏学浅,即使知道这个原理,还是看不懂AGG是如何实现的,我自己也实现了一下,发现还不如利 用初中学的求面积公式直接求面积来得快......希望有高人能点拨下怎么用亚像素精度法来更高效的反走样.<br> 那么我就是用最低级的初中就会的求面积公式来实现反走样的,效果不错,跟AGG效果一样.效率?当然,也跟AGG一样......上个图:<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/crazyccun/b2.jpg" border="0" height="321" width="239"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/crazyccun/c9.jpg" border="0"><br> 在200MHZ的windows mobile上,能跑到8-18桢左右了,当然,只是绘制的话,会比这个快一点,这个还包括了地图坐标转换,裁剪等. <br><br> |
|
|