サンプル

キューイング

キューイング - MascotCapsule eruption

ここではキューイングについて解説します。




※ 開発環境によってダウンロードするサンプルデータが異なります。

目次





キューイングとは描画対象である複数のモデルを一時、描画用のキューに格納し、まとめて描画する方法です。
まとめて描画する際にパラメータを設定することで描画順のソートを自動的に行ってくれるため、例えば多数の透過及び、不透過なモデルが混在する場合などに効果的な処理となります。


1. キューイングの設定

キューイングの設定は、mceGraphics3D_addDrawQueueFigure( This, figure, transform ) を用いて描画対象モデルをキューに格納した後、mceGraphics3D_flushDrawQueue( This, param ) を用いて格納したモデルをまとめて描画します。
キューイングのパラメータは以下の 4 種類が用意されています。

下記のサンプルプログラムでは、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;
    }
}
描画結果 キューイング実行前 描画結果 キューイング実行後
キューイング実行前 キューイング実行後
描画結果



このページの先頭へ戻る