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

如何肯定一个闭合路径(contour)定义的是内区仍是外区?code

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

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

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

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

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

如何绘制Glyph?void

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);
}
相关文章
相关标签/搜索