OpenGL塗りつぶし非凸状の描画


OpenGLは非凸多角形を直接描くことはできませんが、gluTessVertex()というOpenGLの「細分化」の方法で非凸多角形を描くことができます.具体的な原理は次のとおりです.
GLUtesselatorは、任意の多角形を三角形または凸多角形の組み合わせに簡略化し、OpenGLが任意の形状の多角形を描くことができる.
1. gluNewTess();//新しい格子化オブジェクトを作成する2.gluTessCallback();//コールバック関数を登録し、格子化されたいくつかの操作を完了し、そのまま書けばいいです.3. gluTessProperty();//あってもなくてもいいので、いくつかの格子化された属性値を設定します. gluTessBeginPolygon();//多角形draw polygonを描き始める...//ここで多角形を描くと、1つ1つでいいので、最後の点が最初の点と自動的に接続されますgluTessEdnPolygon()//多角形を描くのを終わらせる5.gluDeleteTess();//格子化されたオブジェクトの削除
しかし、実際の操作では、次の問題に注意してください.
多変形上の点gluTessEndPolygon()が実行される前に空間が解放されないことを保証するには、一般的にgluTessBeginContour()が開始される前に多角形の点が指定されているはず!!
OpenGLがポイントの情報を読み込んでいないため、画像が描けない現象が発生します.以下はMFCフレームビューでOpenGLで任意のポリゴンを描く方法ですが、興味のある方はご覧ください.
void CALLBACK PolyLine3DBegin(GLenum type)
{
	glBegin(type);
}

void CALLBACK PolyLine3DVertex(GLdouble * vertex)
{
	const GLdouble *pointer = (GLdouble *)vertex;
	glColor3d(1.0, 0, 0);//        
	glVertex3dv(pointer);
}

void CALLBACK PolyLine3DEnd()
{
	glEnd();
}
void DrawFloor(DataFloor* floor)
{
	if (!floor) return;
	std::vector<glm::vec3>& boundary_pts = *floor->GetBoundaryPtsToFloor();//        

	size_t amount_pts = boundary_pts.size();
	if (amount_pts < 3)
		return;
	GLdouble(*quad)[3];
	quad = new GLdouble[amount_pts][3];//      
	for (int i = 0; i < amount_pts; i++)//        GLdouble(*quad)[3] 
	{
		glm::vec3 pt = boundary_pts.at(i);
		quad[i][0] = pt.x;
		quad[i][1] = pt.y;
		quad[i][2] = pt.z;
	}

	GLfloat curColor[4];
	glGetFloatv(GL_CURRENT_COLOR, curColor);
	glColor3ub((GLubyte)220, (GLubyte)220, (GLubyte)220);

	GLUtesselator* tess = gluNewTess();
	if (!tess) return;
	gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK*)())&PolyLine3DBegin);
	gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK*)())&PolyLine3DVertex);
	gluTessCallback(tess, GLU_TESS_END, (void (CALLBACK*)())&PolyLine3DEnd);
	gluTessBeginPolygon(tess, NULL);
	
	gluTessBeginContour(tess);
	for (int i = 0; i< amount_pts; i++)
	{//  Tess“  ”   
		gluTessVertex(tess, quad[i], quad[i]);

	}
	gluTessEndContour(tess);
	gluTessEndPolygon(tess);
	glColor3f(curColor[0], curColor[1], curColor[2]);
	delete[] quad;//    
}

効果は次のとおりです.
以前、「Tess」の細分化の原理と詳細な説明について2つの文章を転載しましたが、興味のある方はご覧ください.