利用FreeType和OpenGL进行矢量字体渲染

如何确定一个闭合路径(contour)定义的是内区还是外区?

对于一个闭合路径的每个边,如果一定存在另一个点与之构成顺时针三角形,那么是内区。

如果一个闭合路径中存在这样一个边,没有任何点与之构成顺时针三角形,那么是外区。

如何把一个闭合路径(内区)三角化?

任选相邻的三个点A、B、C,它们构成两个相邻的边,并且构成三角形,中点是B;搜索这样的三角形ABC,使得ABC成顺时针方向,并且ABC不包含其它点,保存此三点,删除中点B,重复以上过程,直到路径中仅剩三个点。

解释:一个内区闭合路径必然存在两个相邻的边构成顺时针三角形,否则它不可能定义内区;删除中点后,余下的点依然构成闭合路径,所以前句话还为真。

如何绘制Glyph?

void initializeGL()
{
	glEnable(GL_STENCIL_TEST);
	glDisable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	glClearStencil(0);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}

void paintGL()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//outer contours
	glStencilMask(GL_TRUE);
	glStencilFunc(GL_ALWAYS, 1, 0xf);
	glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
	glDrawArrays(mode, first, count);
//inner contours
	glStencilFunc(GL_GREATER, 1, 0xf);
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
	glDrawArrays(mode, first, count);
}

 

转载于:https://my.oschina.net/u/3465360/blog/1559691

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值