最終更新: mikk_ni3_92 2008年11月28日(金) 10:18:53履歴
現在地: メニュー >> 実践編03
INDEX:実践編02 << 実践編03 >> 実践編04
関連:発展編04
プレーンクリップ、ステンシルバッファを用いると、切断面の表示を表現できる。
以下の図のように、立体の上面が切断面の場合で、
裏面、表面だけを描画した時の画像の差分をとると、切断面が残る。
[例]
※両面ステンシルを用いると1パス(1度の描画)でできる。(→発展編04)
サンプルコード >> 実践編03::まとめコード1
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