DirectXでテクスチャサーフェスをレンダリングターゲットに設定する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
H.MAI

DirectXでテクスチャサーフェスをレンダリングターゲットに設定する方法

#1

投稿記事 by H.MAI » 9年前

先日、こちらで色々と教えて頂き、自分のやりたい事は
レンダリングターゲットに出来るテクスチャサーフェスを作成するという方法で実現できるを教わりました。
ありがとうございました。

ただ今度は、レンダリングターゲットに出来るテクスチャサーフェスの作成がよくわかりません…
訳あって古いバージョンを使っており(ver 7a)、テクスチャサーフェスの作成が大変です。
他のテクスチャは全てD3DXの関数を使って簡単に作成出来ているのですが
レンダリングターゲットに出来るサーフェスを作るには一から自分で設定する必要があるようで
各種パラメータがよくわからないで困っています。
一応、自分なりに初期化してみたのですが、実際に描画してみると真っ黒で思った通りにいきません…
この初期化ではダメなのでしょうか?恐らくテクスチャ作成の初期化コードの部分がマズイものと思われるのですが…
※コードを全部書くと冗長になってしまうので余分なところは省いています

コード:

    
    //レンダリングターゲット初期化
    LPDIRECTDRAWSURFACE7 lpTarget;
    DDSURFACEDESC2       ddsd; 
    ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
    ddsd.dwFlags         = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_TEXTURESTAGE;
    ddsd.ddsCaps.dwCaps  = DDSCAPS_3DDEVICE | DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
    ddsd.ddsCaps.dwCaps2 = 0L;
    ddsd.ddsCaps.dwCaps3 = 0L;
    ddsd.ddsCaps.dwCaps4 = 0L;
    ddsd.dwWidth         = 512;
    ddsd.dwHeight        = 512
    ddsd.dwTextureStage  = 0L;
    
    ddsd.ddpfPixelFormat.dwSize         = sizeof(DDPIXELFORMAT);    
    ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
    ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
    ddsd.ddpfPixelFormat.dwRGBAlphaBitMask  = 0xff000000;
    ddsd.ddpfPixelFormat.dwRBitMask = 0x00ff0000;
    ddsd.ddpfPixelFormat.dwGBitMask = 0x0000ff00;
    ddsd.ddpfPixelFormat.dwBBitMask = 0x000000ff;

    if(lpDD->CreateSurface(&ddsd, &lpTarget, NULL) != DD_OK)
        return FALSE;
    
         ・
         ・
         ・
    
    //描画の一連の処理
    BeginScene();               //描画開始
                                
                                //レンダリングターゲットを変更
    lpD3DDev->SetRenderTarget(lpTarget, 0);

    Draw(lpObj);                //lpObj描画
    
                                
    lpD3DDev->SetRenderTarget(lpBackBuffer, 0);  //レンダリングターゲットをバックバッファに戻す
    
    Draw(lpTarget);             //lpTarget描画
    
    EndScene();                 //描画終了
    
    Update();                   //画面更新(フリップ)
    

ru-pu

Re: DirectXでテクスチャサーフェスをレンダリングターゲットに設定する方法

#2

投稿記事 by ru-pu » 9年前

プログラムの全体を見てみたいとわかりませんが
とりあえず気になった点としては

・DDSCAPS_VIDEOMEMORYは無くても良い
・SetRenderTargetの前にEndSceneを実行、SetRenderTargetの後にBegineSceneを実行

の2点です。
あと、レンダリングターゲットに出来るテクスチャサーフェスはクリアしていますか?

H.MAI

Re: DirectXでテクスチャサーフェスをレンダリングターゲットに設定する方法

#3

投稿記事 by H.MAI » 9年前

ご返信ありがとうございます。
ビデオメモリのフラグやBeginScene~EndSceneのご指摘ありがとうございました。
色々とこちらでもテストしてみたところ、最大の原因としましては
実際に画像ファイルを読み込む関数を挟むと問題なく描画されましたので
詳しく調べてみると、画像を読み込む自作の関数の中で
描画処理用に状態フラグや実際のサーフェスの大きさを保持する変数がありまして
それらが正しく設定されていないせいで描画が上手くいっていなかったようです。
各種の変数を設定すると正しく描画されるようになりました!
大変お騒がせ致しました。今回もありがとうございました!

#古いDirectXの情報はあまり無いので本当に助かっています

H.MAI

Re: DirectXでテクスチャサーフェスをレンダリングターゲットに設定する方法

#4

投稿記事 by H.MAI » 9年前

「解決!」のチェックを入れるのを忘れていました!すみません!
まことにありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る