現在地: メニュー >> 実践編03
INDEX:実践編02 << 実践編03 >> 実践編04
関連:発展編04

切断面の表示


プレーンクリップステンシルバッファを用いると、切断面の表示を表現できる。

以下の図のように、立体の上面が切断面の場合で、
裏面、表面だけを描画した時の画像の差分をとると、切断面が残る。






[例]

	glEnable(GL_CULL_FACE);
		
	glEnable(GL_CLIP_PLANE0);
	glClipPlane(GL_CLIP_PLANE0, PlaneEq);//クリッププレーンを設置
	SetMaterialGold();
	
	//裏面のみ描画(ステンシル値だけ書き込む)
	glEnable(GL_STENCIL_TEST);
	glDisable(GL_DEPTH_TEST);
		
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); //色もかきこまない
	glStencilFunc(GL_ALWAYS, 0, 0);
	glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); //ステンシル値 「+1」
	glCullFace(GL_FRONT); //表面をカリング
	glutSolidSphere(1,30,30);

	//表面のみ描画(→差分をとってマスク画像にする)
	glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);//ステンシル値「-1」

	glCullFace(GL_BACK); //裏面をカリング
	glutSolidSphere(1,30,30);

	//ここからクリップ平面を描画(十分大きく)
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_CLIP_PLANE0);

	//ステンシル値が0でない部分が描画(切断面の描画)
	glStencilFunc(GL_NOTEQUAL, 0, ~0); 
	glPushMatrix();
		glRotatef(90,0,1,0);
		glRectf(-10,10,10,-10);
	glPopMatrix();

	glDisable(GL_STENCIL_TEST);
	glDisable(GL_CULL_FACE);

	glEnable(GL_CLIP_PLANE0);
	glutSolidSphere(1,30,30); //物体全体の描画


※両面ステンシルを用いると1パス(1度の描画)でできる。(→発展編04)

サンプルコード >> 実践編03::まとめコード1

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます