• 締切済み

DirectXでXファイルの描画をするとテクスチャがチラつく

今現在、DirectX9とVC2005のC++を使用してソフトを製作しています。 D3DXCreateTextureFromFileにてXファイルを読み込み、描画をしているのですが なぜか、テクスチャが貼られたメッシュに黒い筋が入り激しくチラつきます。 ただ、これも常にというワケではなく、カメラが動いた時にチラつきます。 また、例えばカメラ移動中にチラついた状態でカメラが止まっても、 メッシュに黒い筋が入ったままだったりということもあります。 状態としては以下の様な感じです。 blog81.fc2.com/e/evom/file/caps.jpg 色々と調べてみて、フィルターを設定したりしてみたのですが状況は改善されず、 何が原因なのかもちょっと検討が付かないです・・・。 どなたか原因がお分かりになる方、ご教授の程よろしくお願い致します。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>D3DTSS_MODULATE D3DTOP_MODULATEのこと。。。かな??

ryu_ki
質問者

補足

間違いだらけで本当お恥ずかしい限りです…大変申し訳ございません。 仰る通り、D3DTOP_MODULATEです。

  • koedame
  • ベストアンサー率33% (10/30)
回答No.1

D3DXCreateTextureFromFile() ↑ の関数はXファイルを読み込むものではありません。 D3DXLoadMeshFromX() ↑ ですよね。w 他のXファイルでも試してください。 そっちでも変なら読み込み部分&描画部分のソースをお見せください。

ryu_ki
質問者

補足

そうでした(笑) お恥ずかしい限りで… とりあえず色々なXファイルでもチラつくので、試行錯誤の結果、 lpD3DDEV->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_COLORARG1); lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); とすると、チラつかずに描画出来ました。 ただ、 lpD3DDEV->SetTextureStageState(0, D3DTSS_COLOROP, D3DTSS_MODULATE); lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); lpD3DDEV->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); とすると、やはりチラついてしまいます。

関連するQ&A

  • DirectXによる「黒い物体」の描画

    現在、DirectXを用いて原潜のメッシュを描画しています。 今はテクスチャを貼っていますが、パフォーマンス改善のためテクスチャを貼らないものも制作しようと思いました。 しかし、黒い物体をそのまま描画すると、当然黒くて形状がわからないものが描画されてしまいます。 そこで質問なのですが、黒い物体を、光沢を付けるなどして形状が明確にわかるように描画するにはどうすればいいでしょうか? 3Dモデル制作の段階や、マテリアルの設定、ライトの設定などの範囲で回答していただけたらなおありがたいです。 なお、自己照明は最大にしており、黒い物体以外は正常に描画されるため、黒い物体だけの問題だと思われます。 回答よろしくお願いします。

  • テクスチャに半透明ポリゴンを描画すると透ける??

    DirectX9で不透明なテクスチャに半透明ポリゴンを描画すると、ポリゴンを描画した部分が透けてしまうのはなぜですか? 1.「D3DUSAGE_RENDERTARGET」指定したテクスチャを作成して白でクリア 2.そのテクスチャに半透明の青いポリゴンをDrawPrimitiveUPで描画 3.そのテクスチャをD3DXSaveTextureToFileでPNG等で保存 とした場合、私のイメージでは白地に薄い青の四角が描かれた不透明な画像ファイルができると思ったんですが、青の部分が半透明になりました。 なぜ不透明なテクスチャに半透明ポリゴンを描くと半透明になるのでしょうか・・・? ―――――――――――――――――――――――――――――――――――― //レンダリング用テクスチャの準備 { global.pDevice->CreateTexture( 512, 512, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTarget, NULL); pTarget->GetSurfaceLevel(0, &pSurface); global.pDevice->GetRenderTarget(0, &pBackBuffer); //バックバッファの取得 global.pDevice->SetRenderTarget(0, pSurface); //ターゲットの切り替え //白(不透明)にクリア global.pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 255, 255, 255), 1.0f, 0 ); } //テクスチャに半透明ポリゴンを描画 { VERTEX point[4] ={ D3DXVECTOR3(100, 200, 1), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(100, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 200, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255), D3DXVECTOR3(200, 100, 0), 1.0f, D3DCOLOR_ARGB(128, 0, 0, 255) }; global.pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE); global.pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, point, sizeof(VERTEX)); global.pDevice->SetRenderTarget(0, pBackBuffer); //レンダリングターゲット戻す } //テクスチャを保存 { D3DXSaveTextureToFile("d:\\hoge.png", D3DXIFF_PNG, pTarget, NULL); } ―――――――――――――――――――――――――――――――― D3DTSS_ALPHAOPをADDにしてみたりしたのですが、変化がありません。 テクスチャが透ける理屈と、こうならないようにする手段(アルファ値は加算したい)を教えてもらえると助かります。

  • DirectX9でのテクスチャフォーマットについて

    いつもお世話になります。 VC6.0&WIN2000、DirectX9.0でプログラムを作っています。 D3DXCreateTextureFromFileInMemoryEx関数でテクスチャを読み込んだあと、テクスチャのメンバ関数のGetLevelDescを行ってみました。 すると、フォーマットの返り値が必ず D3DFMT_A8R8G8B8 になります。 D3DXCreateTextureFromFileInMemoryEx関数で指定したフォーマットと違うのですが、これは何故でしょうか? また上記のせいか、元々の画像ファイルのサイズよりも、多くのメモリを使用しています。 おそらく、1ピクセルを D3DFMT_A8R8G8B8 の大きさでメモリを確保してしまうからだと思うのですが、本来の画像フォーマットの大きさで確保する方法はないでしょうか? それでは、どうぞ宜しくお願いします。

  • directxのspriteの描画について

    VisualStudioによりc++とdirectxを使って3Dオブジェクト(xファイルなど)とspriteによるテクスチャの描画をしたいのです。3Dの格闘ゲームのようにカメラが動いているのに、ライフバーが固定されているようなものを作りたいのです。 3Dオブジェクトはプロジェクション変換とビューポート変換をして描画し、spriteのテクスチャは画面の左上を座標(0,0)として描画したいのですが、どのように実装すればいいのでしょうか? 現時点ではspriteを描画する前にプロジェクション変換とビューポート変換のときに使うポインタを初期化してパイプラインに送ればいいと考えやったのですが、3Dオブジェクトは描画されているのですがspriteはうまくいきませんでした。

  • Directxで一度に描画する方法

    DirectXで複数枚のポリゴンを描画しているのですが、それぞれ頂点変換行列やテクスチャが違うのでDrawPrimitiveをポリゴン毎に呼び出さなければいけなくなっています。 上記のような状態で一度に描画する方法はありますでしょうか?

  • DirectX:描画されません・・・ヒント下さい・・・

    VCでC++を使ってDirectXを使ったプログラムを書いてます。 そういう仕事しているわけではなく、素人です。 DirectXは色々とややこしくて、何がなんだかさっぱりです。 とりあえず、Win32APIを使って、ウィンドウを表示し、DirectXを使って、ボタンを押すことで、ウィンドウモードとフルスクリーンモードを切り替えることの出来るプログラムは作れました。 しかし、3Dのモデルが表示されません。 何が駄目なのかが、さっぱりです。 こういう場合、何に原因があることが多いのでしょうか?? DirectX経験者の方、どうか、教えてください。お願いします。 以下に現在の状況を列挙します。 足りなければ、ご指摘ください。 ソースは見せることはできるのですが、かなり、スパゲティーなので・・・・。 DirectX:November 2008 目標:Xファイルからじゃなく座標を自分で指定して立方体を描画したい 出来ていると思われること ・Win32APIを使ったウィンドウの作成 ・Direct3Dオブジェクトの作成Direct3DCreate9⇒  D3DDeviceオブジェクトのプレゼンテーションパラメータの設定 ・カメラとライトの設定 ・あと、DirectXのメソッドで背景色だけは変えられます。 経験者の方がた、よろしくお願いします!!

  • DIRECTXのスプライト描画で質問です

    いつもお世話になってます。 DIRECTX9.0、VC++6.0を使っています。 DIRECTXでLPDIRECT3DTEXTURE9(テクスチャ)とLPD3DXSPRITE(スプライト)を使って描画しています。 ですが、テクスチャの縦と横のサイズが256*256を超えたものが正常に表示できません。 色々調べてみると、縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるみたいですが、一応縦横共に2の乗数のテクスチャなのにうまく表示できません。 例:768*512ピクセルのTGA形式のファイル 大きな画像ファイルを表示する方法はないでしょうか? どうぞ宜しくお願いします。

  • テクスチャがうまく表示されない[DirectX]

    こんにちわ。初歩的な質問かもしれませんが、よろしくお願いします。 テクスチャは読み込まれてはいるのですが、(色だけは表示される。違う画像にすると色が変わる)どうも模様が表示されず、画像どおりになりません。 とりあえず関係ありそうなコードだけ。。 -----頂点定義-------- struct CUSTOMVERTEX {FLOAT X,Y,Z; D3DVECTOR NORMAL; FLOAT U,V;}; #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) ----頂点------ struct CUSTOMVERTEX t_vert[]={ {0.0f, 0.0f,0.0f,0,1,0, 0.0f, 0.0f,}, {-30.0f,0.0f,0.0f,0,1,0, 1.0f, 0.0f,}, {0.0f, 0.0f,30.0f,0,1,0, 0.0f, 1.0f,}, {-30.0f,0.0f,30.0f,0,1,0, 1.0f, 1.0f,}, }; -------描画処理------ d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX)); d3ddev->SetTexture( 0 , texture ); d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); ------------------------------------------------------------- テクスチャのサイズは512x512px、ライトはD3DRS_LIGHTNINGでTRUEにしてもFALSEにしても変化なし。 環境は以下のとおりです。 OS: WindowsXP コンパイラ:VisualStudio2005 DirectX9.0

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • Open CV でBitmap描画の高速化

     現在Open CVとVC++2008のC++/CLIを用いてform上のpictureBoxにカメラ画像を表示するプログラムを作成しています。  プログラムは,http://imagingsolution.blog107.fc2.com/blog-entry-91.htmlのサイトの『IplImageのPictureBoxへの描画』の項を参考にさせていただきました。 カメラ画像の描画だけでしたら,問題なく動作しますが,その他の処理を行うと,全体の動作が遅くなってしまいます。 そこで,どうにかして全体の動作速度あげようと,調べているとBitmapの描画は遅いということはわかりました。 しかし,どのようにすればBitmap描画を高速化出来るのかがわかりません... お分かりになる方がいらっしゃいましたら,何卒ご教授お願い致します。