サンプル
キューイング
ここではキューイングについて解説します。
※ 開発環境によってダウンロードするサンプルデータが異なります。
目次
キューイングとは描画対象である複数のモデルを一時、描画用のキューに格納し、まとめて描画する方法です。
まとめて描画する際にパラメータを設定することで描画順のソートを自動的に行ってくれるため、例えば多数の透過及び、不透過なモデルが混在する場合などに効果的な処理となります。
1. キューイングの設定
キューイングの設定は、mceGraphics3D_addDrawQueueFigure( This, figure, transform ) を用いて描画対象モデルをキューに格納した後、mceGraphics3D_flushDrawQueue( This, param ) を用いて格納したモデルをまとめて描画します。
キューイングのパラメータは以下の 4 種類が用意されています。
- MCE_GRAPHICS3D_CAMERA_SORT
サブメッシュ単位でのソートです。カメラ位置から透過のサブメッシュは Z 位置が遠いもの、不透過のサブメッシュは Z 位置が近いものの順にソートします。 - MCE_GRAPHICS3D_FRUSTUM_CULLING
サブメッシュ単位でのフラスタムカリングを行ないます。 - MCE_GRAPHICS3D_FRUSTUM_CULLING_INDEX_BUFFER_BS
mceIndexBuffer に関連付けられた mceGeometricShape によるフラスタムカリングを行ないます。 - MCE_GRAPHICS3D_FRUSTUM_CULLING_FIGURE_BS
mceFigure に関連付けられた mceGeometricShape によるフラスタムカリングを行ないます。
下記のサンプルプログラムでは、MCE_GRAPHICS3D_CAMERA_SORT を用いたキューイングを行なっています。
typedef struct tagWork
{
(中略)
mceGraphics3D *G3d; /* Graphics3D */
(中略)
mceFigure *Figure0; /* Figure0 */
mceFigure *Figure1; /* Figure1 */
mceFigure *Figure2; /* Figure2 */
(中略)
mceAppearance *Appe; /* Appearance */
/*------ キュー ------*/
hi_uint8 QueueFlag; /* キューフラグ */
(中略)
} WORK;
hi_exception exception;
hi_sint32 data;
(中略)
/* Figrue1のmceAppearanceを取得 */
work->Appe = (mceAppearance *)mceObject3D_findObject3D (
(mceObject3D *)work->Figure1,
ClassId_Appearance,
0);
if (work->Appe == NULL)
{
return 1;
}
/* ブレンドモードを設定 */
exception = mceAppearance_setBlendMode (work->Appe,
mceAppearance_BlendMode_ALPHA);
if (exception != hi_NoException)
{
return 1;
}
/* テクスチャブレンドモードを設定 */
exception = mceAppearance_setTextureBlendMode (work->Appe,
0, mceAppearance_Texture_FUNC_MODULATE);
if (exception != hi_NoException)
{
return 1;
}
/* Figure1を半透明化 */
data = mceAppearance_getColor (work->Appe,
mceAppearance_MaterialType_DIFFUSE,
&exception);
data = (data & 0x00ffffff) | (0x80 << 24);
exception = mceAppearance_setColor (work->Appe,
mceAppearance_MaterialType_DIFFUSE,
data);
if (exception != hi_NoException)
{
return 1;
}
/*----- キュー -----*/
work->QueueFlag = 1;
(中略)
mceTransform matrix;
mceTransform matrix2;
(中略)
/* カメラからの距離を一番遠くに設定したFigure2を描画 */
exception = mceGraphics3D_drawFigure (work->G3d, work->Figure2,
&matrix, 0);
if (exception != hi_NoException)
{
return 1;
}
/* キューイングの切り替え */
if (work->QueueFlag == 0)
{
(中略)
/* カメラからの距離を一番近くに設定したFigure1を描画 */
exception = mceGraphics3D_drawFigure (work->G3d,
work->Figure1, &matrix, 0);
if (exception != hi_NoException)
{
return 1;
}
(中略)
/* カメラからの距離をFigure1,2の中間値に設定したFigure0を描画 */
exception = mceGraphics3D_drawFigure (work->G3d,
work->Figure0, &matrix2, 0);
if (exception != hi_NoException)
{
return 1;
}
}
else
{
(中略)
/* カメラからの距離を一番近くに設定したFigure1をキューに追加 */
exception = mceGraphics3D_addDrawQueueFigure (work->G3d,
work->Figure1, &matrix);
if (exception != hi_NoException)
{
return 1;
}
(中略)
/* カメラからの距離をFigure1,2の中間値に設定したFigure0をキューに追加 */
exception = mceGraphics3D_addDrawQueueFigure (work->G3d,
work->Figure0, &matrix2);
if (exception != hi_NoException)
{
return 1;
}
/* カメラからの距離を元にキューに格納されている2つのモデルを描画 */
exception = mceGraphics3D_flushDrawQueue (work->G3d,
MCE_GRAPHICS3D_CAMERA_SORT);
if (exception != hi_NoException)
{
return 1;
}
}
![]() |
![]() |
| キューイング実行前 | キューイング実行後 |
| 描画結果 | |



