トップページ > 過去ログ > 記事閲覧
3D関連の後のDrawOval
名前:埴輪 日時: 2012/07/07 23:25

お世話になっております。 DrawPolygonIndexed3D_UseVertexBuffer DrawLine3D MV1SetMatrix MV1DrawModel などの3D描画関連の関数を使用した後の DrawOvalで楕円が描画されません。 (それぞれをコメントアウトしてみたところ、 一つでも有るとダメでした。) また上記3D描画関連の関数を使用した後 DrawBoxをDrawOvalとの間に挟むと 四角形も楕円も描画されました。 ご確認お願いします。 それから、 vertex_buffer=CreateVertexBuffer(頂点数,DX_VERTEX_TYPE_NORMAL_3D); SetVertexBufferData( 0,VERTEX3Dの配列,頂点数,vertex_buffer); という部分をVC++2010EEでデバッグするとCreateVertexBufferのところで、 HEAP[hoge.exe]: HEAP: Free Heap block 2547f78 modified at 2547fe0 after it was freed Windows によって hoge.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。 hoge.exe または読み込まれた DLL にバグがあります。 あるいは、hoge.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 と表示されることがあります。このとき、-1でもない負の数(0xcdcdcdcd(=-842150451))が返されています。 上記の使用法に何か誤りがあるのでしょうか。 蛇足ですが、リファレンスの引数欄にて 「楕円」ではなく「円」となっていたことも ご報告申し上げます。

Page: 1 |

Re: 3D関連の後のDrawOval ( No.1 )
名前:管理人 日時:2012/07/08 17:20

ご報告ありがとうございます 3D描画関連の関数を実行した後に DrawOval が機能しない原因は単純な記述ミスでした 修正版をアップしましたのでよろしければお試しください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) リファレンスの DrawOval の記述ミスも修正しました、ご指摘ありがとうございます CreateVertexBuffer についてですが、こちらのような単純なテストコードでも同様のエラーが 発生しますでしょうか? #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VERTEX3D Vertex[ 4 ] ; WORD Index[ 6 ] ; int VertexBufHandle ; int IndexBufHandle ; // DXライブラリの初期化 ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 4頂点分の頂点バッファを作成 VertexBufHandle = CreateVertexBuffer( 4, DX_VERTEX_TYPE_NORMAL_3D ) ; // 6個分のインデックスバッファを作成 IndexBufHandle = CreateIndexBuffer( 6, DX_INDEX_TYPE_16BIT ) ; // 4頂点分のデータをセット Vertex[ 0 ].pos = VGet( 100.0f, 100.0f, 0.0f ) ; Vertex[ 0 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ; Vertex[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 0 ].u = 0.0f ; Vertex[ 0 ].v = 0.0f ; Vertex[ 0 ].su = 0.0f ; Vertex[ 0 ].sv = 0.0f ; Vertex[ 1 ].pos = VGet( 250.0f, 100.0f, 0.0f ) ; Vertex[ 1 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ; Vertex[ 1 ].dif = GetColorU8( 255, 0,255,255 ) ; Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 1 ].u = 0.0f ; Vertex[ 1 ].v = 0.0f ; Vertex[ 1 ].su = 0.0f ; Vertex[ 1 ].sv = 0.0f ; Vertex[ 2 ].pos = VGet( 100.0f, 300.0f, 0.0f ) ; Vertex[ 2 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ; Vertex[ 2 ].dif = GetColorU8( 0,255,255,255 ) ; Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 2 ].u = 0.0f ; Vertex[ 2 ].v = 0.0f ; Vertex[ 2 ].su = 0.0f ; Vertex[ 2 ].sv = 0.0f ; Vertex[ 3 ].pos = VGet( 400.0f, 200.0f, 0.0f ) ; Vertex[ 3 ].norm = VGet( 0.0f, 0.0f, -1.0f ) ; Vertex[ 3 ].dif = GetColorU8( 0,255,255,255 ) ; Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 3 ].u = 0.0f ; Vertex[ 3 ].v = 0.0f ; Vertex[ 3 ].su = 0.0f ; Vertex[ 3 ].sv = 0.0f ; // 2ポリゴン分のインデックスデータをセット Index[ 0 ] = 0 ; Index[ 1 ] = 1 ; Index[ 2 ] = 2 ; Index[ 3 ] = 3 ; Index[ 4 ] = 2 ; Index[ 5 ] = 1 ; // 頂点データを頂点バッファに転送 SetVertexBufferData( 0, Vertex, 4, VertexBufHandle ) ; // インデックスデータをインデックスバッファに転送 SetIndexBufferData( 0, Index, 6, IndexBufHandle ) ; // 頂点バッファとインデックスバッファを使用した2ポリゴンの描画 DrawPolygonIndexed3D_UseVertexBuffer( VertexBufHandle, IndexBufHandle, DX_NONE_GRAPH, FALSE ) ; // キー入力待ちをする WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
Re: 3D関連の後のDrawOval ( No.2 )
名前:埴輪 日時:2012/07/08 20:15

対応ありがとうございます。 CreateVertexBuffer()につきまして、 こちら(VC++2010EE)で確認してみましたところ、 ご提示いただいたテストコードでは正常に動作しました。 ただ、実際は数十個作成することになるので // 4頂点分の頂点バッファを作成 VertexBufHandle = CreateVertexBuffer( 4, DX_VERTEX_TYPE_NORMAL_3D ) ; // 6個分のインデックスバッファを作成 IndexBufHandle = CreateIndexBuffer( 6, DX_INDEX_TYPE_16BIT ) ; 部分を for(int i=0;i<100;i++) で囲ってみましたところ、 プログラム終了時に同様のヒープ破損エラーが出ました。 ちなみに、 SetVertexBufferData( 0, Vertex, 4, VertexBufHandle ) ; のところにブレークポイントを打ってVertexBufHandleの値を 調べたところ、毎回0x3c630063でした。 (VB2010EEなど重いものをいくつか起動させ メモリの空き状況を変えても同じでした) タスクマネージャによると利用可能メモリは1GiB以上あるので メモリリークは起こしていないと思うのですが・・・。 もしかして、CreateVertexBufferやCreateIndexBuffer は仕様上、複数のバッファを作成することはできないのでしょうか?
Re: 3D関連の後のDrawOval ( No.3 )
名前:管理人 日時:2012/07/15 06:08

ご情報ありがとうございます すみません、CreateVertexBuffer と CreateIndexBuffer にメモリの不正なアクセスをしてしまうバグがありました 修正版をアップしましたので、よろしければお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > もしかして、CreateVertexBufferやCreateIndexBuffer > は仕様上、複数のバッファを作成することはできないのでしょうか? いえ、最大16384個まで作れるようになっています
Re: 3D関連の後のDrawOval ( No.4 )
名前:埴輪(解決) 日時:2012/07/16 00:44

対応ありがとうございます。 落ちなくなりました。 また、楕円のほうもうまくいきました。 ありがとうございます!

Page: 1 |