Zソート描画時の特定状況下における異常描画の回避
広い平面上に小さな物体を乗せる等、サイズが大きく異なる複数のモデルを同時に描画するとき、MascotCapsule V3では陰面消去にZソートを使用しているため、モデルが正しく描画されないことがあります。 ここで、ポリゴンの位置関係があらかじめ分かっている際にレンダリングとフラッシュ処理を分割して行うことで、この異常描画を防ぐことができます。
例えば、前述のような広い平面上に小さな物体を乗せた状態を描画する際は、まず広い平面に対してレンダリング、フラッシュ処理を行い、次に小さな物体に対してレンダリング、フラッシュ処理を行うようにします。ここでは、この手法を便宜的に「ダブルフラッシュ」と呼ぶことにします。
サンプルプログラムでは、大きい平面上に小さい平面と小さな球を配置しています。普通に描画すると小さい平面と球が埋もれてしまいますが、ダブルフラッシュを用いることで正しく描画することができます。
以下はサンプルプログラム内のダブルフラッシュを行っている部分です。ソフトキーを押してダブルフラッシュと通常の描画を切り替えることができます。
/* m3dtest.h 内モデルデータ構造体 */
/* Object Datas */
typedef struct tag_Object{
/* m3dtest.c : draw_() 関数内*/
/* ダブルフラッシュ */
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.plane_big );
OEMC_Micro3D_Render_flush( &render );
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.plane_small );
OEMC_Micro3D_Render_flush( &render );
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.sphere );
OEMC_Micro3D_Render_flush( &render );
/* Object Datas */
typedef struct tag_Object{
Figure sphere ; /* Small Sphere */
Figure plane_big ; /* Big Plane */
Figure plane_small ; /* Small Plane */
Texture tex ; /* Texture */
}Object;Figure plane_big ; /* Big Plane */
Figure plane_small ; /* Small Plane */
Texture tex ; /* Texture */
/* m3dtest.c : draw_() 関数内*/
/* ダブルフラッシュ */
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.plane_big );
OEMC_Micro3D_Render_flush( &render );
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.plane_small );
OEMC_Micro3D_Render_flush( &render );
OEMC_Micro3D_Render_setTexture( &render, &object.tex );
OEMC_Micro3D_Render_setViewTrans( &render, &view_trans );
OEMC_Micro3D_Render_drawFigure( &render, &object.sphere );
OEMC_Micro3D_Render_flush( &render );
![]() |
![]() |
| ダブルフラッシュを用いた描画 | 通常の描画 |



