トップページ > 記事閲覧
頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい
名前:was-blue.0793 日時: 2023/01/17 14:41

いつもお世話になっております。 現在、大量に単純なポリゴンを描画する処理をDrawPolygonIndexed3D_UseVertexBuffer関数を使った頂点バッファベースの処理に変更しようとしています。 その中で「複数のポリゴンの大きさを変えずに間隔だけ可変にする」処理を作成しようとしていて、例えばこのような値になります: --- ポリゴン間の間隔は「50」 ・ポリゴン1 中心座標(0,0,0) 頂点(-10,0,-10),(10,0,-10),(10,0,10),(-10,0,10) ・ポリゴン2 中心座標(0,0,50) 頂点(-10,0,40),(10,0,40),(10,0,60),(-10,0,60) ・ポリゴン3 中心座標(0,0,100) 頂点(-10,0,90),(10,0,90),(10,0,110),(-10,0,110) ・ポリゴン4 中心座標(0,0,150) 頂点(-10,0,140),(10,0,140),(10,0,160),(-10,0,160) --- この時、間隔が外部入力で常に変わる可能性がありますがSetVertexBufferData関数を何度も呼ぶことが好ましくありません。 実際には座標以外にも頂点の情報を外部入力で一部だけ書き換える必要がある(色の明暗変更、uv座標の変更など)処理があるのですが、これらをSetVertexBufferData関数を何度も呼ぶことなく実現することはできますか? それでは、よろしくお願いします。
メンテ

Page: 1 |

Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.1 )
名前:管理人 日時:2023/01/17 23:44

> 実際には座標以外にも頂点の情報を外部入力で一部だけ書き換える必要がある(色の明暗変更、uv座標の変更など)処理があるのですが、これらをSetVertexBufferData関数を何度も呼ぶことなく実現することはできますか? > それでは、よろしくお願いします。 私の知る限りでは SetVertexBufferData関数を呼ぶ以外の書き換え方法はありません 常に頂点データが変化する可能性がある場合は頂点バッファを使用する DrawPolygonIndexed3D_UseVertexBuffer ではなく、 システムメモリ上にある頂点データで描画する DrawPolygonIndexed3D を使用された方が良いかと思います
メンテ
Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.2 )
名前:was-blue.0793 日時:2023/01/18 13:22

かしこまりました。 それでは、DrawPolygonIndexed3D_UseVertexBuffer関数では32bitの頂点インデックスに対応しておりますが、 DrawPolygonIndexed3D関数についても同じように32bitの頂点インデックスに対応することはできますか? 引数「IndexArray」の型が「unsigned int*」になるようなイメージです。 それでは、よろしくお願いします。
メンテ
Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.3 )
名前:管理人 日時:2023/01/19 00:30

了解です DrawPolygonIndexed3D の頂点インデックスが 32bit となっている関数を追加しましたので、 よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // 3Dポリゴンを描画する( 頂点インデックスを使用 ) int DrawPolygon32bitIndexed3D( VERTEX3D *VertexArray, int VertexNum, unsigned int *IndexArray, int PolygonNum, int GrHandle, int TransFlag ) ; 頂点インデックスの引数の型が unsigned int * になった以外は DrawPolygonIndexed3D と同じです よろしければお試しください m(_ _)m
メンテ
Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.4 )
名前:was-blue.0793 日時:2023/01/21 17:54

>>管理人さん ご対応ありがとうございます。 使用してみたところ、「DrawPolygon32bitIndexed3D」では「DrawPolygonIndexed3D」と同じように描画されない不具合があると思われます。 こちらがテストコードになります。 奥に青のポリゴン2枚・手前に緑のポリゴン2枚が描画されることを想定した描画ですが、「DrawPolygon32bitIndexed3D」を使っている緑のポリゴンが正常に描画されません。 両方「DrawPolygonIndexed3D」で描画した場合は青と緑のポリゴンが正常に描画されました。 --- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode(TRUE) ; // DXライブラリの初期化 if(DxLib_Init() < 0) return -1 ; // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK) ; //カメラ設定 SetCameraDotAspect(640.0f / 480.0f) SetupCamera_Perspective(1.047f); SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 200.0f, -100.0f), VGet(0.0f, 0.0f, 136.0f)) SetCameraNearFar(182.5f, 1000.0f) //頂点データ std::vector<VERTEX3D> vert16; std::vector<VERTEX3D> vert32; //頂点インデックスデータ std::vector<uint16_t> index16; std::vector<uint32_t> index32; //16ビット版の頂点生成 vert16.resize(8); vert16[0].pos = VGet(-50.0f, 0.0f, 200.0f); vert16[0].norm = VGet(0.0f, 1.0f, 0.0f); vert16[0].dif = GetColorU8(0, 0, 255, 255); vert16[0].spc = GetColorU8(0, 0, 0, 255); vert16[0].u = 0.0f; vert16[0].v = 0.0f; vert16[0].su = 0.0f; vert16[0].sv = 0.0f; vert16[1].pos = VGet(-50.0f, 0.0f, 200.0f); vert16[1].norm = VGet(0.0f, 1.0f, 0.0f); vert16[1].dif = GetColorU8(0, 0, 255, 255); vert16[1].spc = GetColorU8(0, 0, 0, 255); vert16[1].u = 0.0f; vert16[1].v = 0.0f; vert16[1].su = 0.0f; vert16[1].sv = 0.0f; vert16[2].pos = VGet(-30.0f, 0.0f, 200.0f); vert16[2].norm = VGet(0.0f, 1.0f, 0.0f); vert16[2].dif = GetColorU8(0, 0, 255, 255); vert16[2].spc = GetColorU8(0, 0, 0, 255); vert16[2].u = 0.0f; vert16[2].v = 0.0f; vert16[2].su = 0.0f; vert16[2].sv = 0.0f; vert16[3].pos = VGet(-50.0f, 0.0f, 100.0f); vert16[3].norm = VGet(0.0f, 1.0f, 0.0f); vert16[3].dif = GetColorU8(0, 0, 255, 255); vert16[3].spc = GetColorU8(0, 0, 0, 255); vert16[3].u = 0.0f; vert16[3].v = 0.0f; vert16[3].su = 0.0f; vert16[3].sv = 0.0f; vert16[4].pos = VGet(50.0f, 0.0f, 200.0f); vert16[4].norm = VGet(0.0f, 1.0f, 0.0f); vert16[4].dif = GetColorU8(0, 0, 255, 255); vert16[4].spc = GetColorU8(0, 0, 0, 255); vert16[4].u = 0.0f; vert16[4].v = 0.0f; vert16[4].su = 0.0f; vert16[4].sv = 0.0f; vert16[5].pos = VGet(-50.0f, 0.0f, 100.0f); vert16[5].norm = VGet(0.0f, 1.0f, 0.0f); vert16[5].dif = GetColorU8(0, 0, 255, 255); vert16[5].spc = GetColorU8(0, 0, 0, 255); vert16[5].u = 0.0f; vert16[5].v = 0.0f; vert16[5].su = 0.0f; vert16[5].sv = 0.0f; vert16[6].pos = VGet(30.0f, 0.0f, 100.0f); vert16[6].norm = VGet(0.0f, 1.0f, 0.0f); vert16[6].dif = GetColorU8(0, 0, 255, 255); vert16[6].spc = GetColorU8(0, 0, 0, 255); vert16[6].u = 0.0f; vert16[6].v = 0.0f; vert16[6].su = 0.0f; vert16[6].sv = 0.0f; vert16[7].pos = VGet(50.0f, 0.0f, 100.0f); vert16[7].norm = VGet(0.0f, 1.0f, 0.0f); vert16[7].dif = GetColorU8(0, 0, 255, 255); vert16[7].spc = GetColorU8(0, 0, 0, 255); vert16[7].u = 0.0f; vert16[7].v = 0.0f; vert16[7].su = 0.0f; vert16[7].sv = 0.0f; //32ビット版の頂点生成(z方向手前に100ずらし、色を緑に変更) vert32 = vert16; for (auto& a : vert32) { a.pos.z -= 100.0f; a.dif.g = 255; a.dif.b = 0; } //頂点インデックスの設定 index16 = { 0,1,2,0,2,3,4,5,6,4,6,7 }; index32 = { 0,1,2,0,2,3,4,5,6,4,6,7 }; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; //ポリゴンの描画 DrawPolygonIndexed3D(vert16.data(), vert16.size(), index16.data(), index16.size() / 3, DX_NONE_GRAPH, FALSE); DrawPolygon32bitIndexed3D(vert32.data(), vert32.size(), index32.data(), index32.size() / 3, DX_NONE_GRAPH, FALSE); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.5 )
名前:管理人 日時:2023/01/22 02:17

すみません、DrawPolygonIndexed3D と DrawPolygon32bitIndexed3D をどちらも使うと DrawPolygon32bitIndexed3D の描画が行われないバグがありました 修正しましたので、お手数で申し訳ありませんが よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 頂点バッファを使ったポリゴン描画を間隔だけ可変にしたい ( No.6 )
名前:管理人 日時:2023/01/25 05:35

すみません、No.5 のタイミングでアップした暫定最新バージョンで 非同期読み込み関連のバグがありました 修正版をアップしましたので、既にダウンロードされていましたら お手数で申し訳ありませんが再度同じURLから修正版をダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存