利用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);
}
相關文章
相關標籤/搜索