最近のトラックバック

無料ブログはココログ

« 【DirectX】LightWave3DアニメーションX出力 | トップページ | 【デザイン】UI »

【QuadrupleD】線(2頂点)ポリゴン

 QuadrupleDのプリミティブが扱えるのは3頂点ポリゴンのみなので、線ポリゴンを引くのは困難。
 そこで、ちょっと無理やりだけどSXlibのTSXmesh.Vbufに3点分の頂点を(x1,y1) (x2,y2) (x2,y2)と入れてみる試み。

結果は、予想通りいまいち(笑)
線ポリゴンじゃないので、カメラの距離や角度によってはちらつくし、2つ目と3つ目の頂点が同一なので消えちゃうことも。

で、ここから色々と試行錯誤。

IDirect3DDevice9.DrawPrimitive で直接ポリゴンを描画するのが手順としては正しいのだけど、それだけではSXlibの管理にはならない(と思う)ので、ちょっと困る。

かといって、SXlibの仕様を2頂点を扱えるように変更するのも骨が折れる。というかそこまでするならSXlibtukawanaide自前で実装する方がいいようにも思う。

そんなこんなで思いついた悪知恵。

頂点をSXlibのTSXmesh.Vbuf / Ibuf に登録してそのうち先頭から2つめまでをIDirect3DDevice9.DrawIndexedPrimitive で描画してみる。

結果は描画できた。
TSXmeshをTSXFrameに追加しておけばマトリクス操作もSXlib管理下で行えた。もっともSXlibのソースを真似て実装したので当然といえば当然かも。

//-------------------------------------------
//ラインポリゴンを描画する手続きはこんな感じ
//-------------------------------------------
procedure DrawLine(FOwner:TDGCarad; _vBuf: TDGVertexBuffer;  _iBuf:TDGIndexBuffer);
var
    ofs,primCount:UINT;
begin

    //SXlibから拝借

    FOwner.D3DDevice.SetFVF(_vBuf.FVF);
    FOwner.D3DDevice.SetIndices(_iBuf.IndexBuffer);
    FOWner.D3DDevice.SetStreamSource(0, _vBuf.VertexBuffer, 0, _vBuf.VertexSize);

    //primCountずつ分割して描画
    ofs:=0;
    while ofs < ( _iBuf.Count-1) do begin

      primCount := (_iBuf.Count - ofs) div 2;
      if primCount > 10000 then
        primCount := 10000;

      FOwner.D3DDevice.DrawIndexedPrimitive(
                                D3DPT_LINELIST,
                                0,
                                0,
                               _vBuf.Count,
                               ofs,
                               primCount);

      Inc(ofs, primCount*2);
    end;

end;

//------------------ここまで-------------------------

しかし問題点もいくつか。

  • 描画だけはSXlibの管理下に無い(TSXscene.Render()では描画されない)ので自前で手続きを呼ばなければならない。
    ってそういう構造にしたんだからあたりまえ^^;
    //描画シーケンス
    //描画開始
    DG.D3DDevice.BeginScene;

    //画面消去(濃い青)
    Scene.Clear(D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, $FF000088, 1.0, 0);

    //シーンの内容を全部描く
    Scene.Render(Root);

    //ライトオフ(任意)
    DG.D3DDevice.SetRenderState(D3DRS_LIGHTING, DWORD(false));

    //ラインポリゴンを描く
    DrawLine(DG, xyzMesh.VBuf, xyzMesh.IBuf);

    //ライトオン
    DG.D3DDevice.SetRenderState(D3DRS_LIGHTING, DWORD(true));

    //描画終り
    DG.D3DDevice.EndScene;

    //表示
    DG.D3DDevice.Present(Nil, Nil, 0, Nil);
     
  • なぜか最後に描画したフレームの子と扱われてしまう。多分実装方法に問題があるのだと思うけど、今の私には見当も付きません(笑)
    河口対策ですが、線ポリゴンのフレームを登録後にNull(Meshのない)フレームを登録してしのいでます。
  • 使っていない3つ目の頂点バッファの存在が気がかり。悪さしなけりゃいいけど。

うーん・・・なんかキケンな香りがする。もっと賢い実装方法は無いものか・・・。

« 【DirectX】LightWave3DアニメーションX出力 | トップページ | 【デザイン】UI »

DirectX」カテゴリの記事

Quadruple D」カテゴリの記事

コメント

いまさらながら線ポリゴンのその後。

> なぜか最後に描画したフレームの子と扱われてしまう。

これはTSXFrameに線ポリゴンのmeshを登録していないため。
しかし、登録するとSXLibの管理下になりTSXscene.Renderでレンダリングすると3頂点ポリゴンと解釈され正しく描画されない。

>使っていない3つ目の頂点バッファの存在が気がかり。

自前でDrawIndexedPrimitiveを呼び出すなら大丈夫。前述のようにTSXFrameに登録してレンダリングすると正しくレンダリングされない。

ちなみに、TSXFrame.mesh に登録しただけではTSXscene.Renderでレンダリングされない。レンダリングするためにはUpdateBoundsでメッシュのバウンディング球を計算しておく必要がある。そうしないとカメラの視野外ということでカリングされてしまう。

現時点でわかったことはこのくらいです・・・。

コメントを書く

(ウェブ上には掲載しません)

« 【DirectX】LightWave3DアニメーションX出力 | トップページ | 【デザイン】UI »