かんたんXNA その29 テクスチャへの描画 RenderTarget 時々お世話になる「かんたんXNA」で、レンダーターゲットのお勉強。XNA3.0ではバージョンが異なるコードもあるようだ。
◎GetTexture前回コメントで、yohさんからRenderTarget2D.GetTexture()を教えて頂きました。
メソッド名がGetTextureで戻り値がTexture2Dなので、画面出力をテクスチャに落とせるんじゃないかと期待してしまいますが、ネット上でサンプルを探すと画面の初期化処理らしきもの(?)が多く、ツールに利用したものは見当たりません。
XNAのヘルプには
このレンダリング ターゲットに関連付けられている 2D テクスチャを取得します。とあります。とりあえずヘルプのサンプルコードをコピペして実行したら、ブルースクリーンならぬパープルスクリーン状態になって、シャットダウンすらできなくなりました(汗)
◎レンダーターゲットその後LAGさんから「先にレンダーターゲットを設定する必要がある」とご指摘を頂きました。レンダーターゲットについてもっと勉強しないといけないなぁ…。
というわけで、
冒頭の記事や
ヘルプで勉強させて頂きました。
記事を読んでからヘルプを読むとわかりやすくて良いのですが、記事中のGraphicsDevice.ResolveRenderTargetメソッドや、GraphicsDeviceCapabilities.NumberSimultaneousRenderTargetsプロパティはXNA3.0では存在しないようです。多分仕様変更されたのでしょう。
◎またしてもハード記事のコードをコピペして実行すると、
renderTarget = new RenderTarget2D(〜);の所で例外エラーになりました。
An unexpected error has occurred.ここでしばらく試行錯誤しましたが、4番目の引数のnumberLevelsを0→1にしたらエラーが解消され動きました。
GetTextureで取得した画像を表示するテスト引数の違いは、仕様変更の影響でしょうか?それとも私のハード環境の問題?
気になったのでネットで調べたら、
こちらの記事に回答がありました。numberLevelsは、ミップマップを生成するレベルのことだっんですね。1つ勉強になりました。
それはともかく、またしてもハードでした。もはやお決まりのパターン…。
しかし回答でItoさんが言ってるように「テクスチャのサイズが2のn乗でないときにミップマップをサポートしないビデオカードは少なくない」なら、せめてもう少しわかりやすいエラーを返してくれたらいいのになぁ。
◎ファイル出力画面出力をテクスチャに落とすことが出来たので、今度はテクスチャからファイルに落とします。
Texture2D.Save()こんな便利なメソッドあったっけ?まぁ今まではテクスチャの加工生成方法がわからなかったから使えなかったのか。
Texture2D capturedTexture;
capturedTexture.Save("TestCapture01", ImageFileFormat.Bmp);これで、BMPファイルが出力できました。
やった!これで全自動ツールが作れますよ〜!
◎サンプルコードというわけで、HPにサンプルコードをUPしました。
XNAの画面ハードコピー(スクリーンショット)取得サンプルコード◎次回予告ついに念願の「XNAの画面を自動的にファイルに落とす」が出来るようになりました!
yohさん、LAGさん、ありがとうございました!
次回は、この技術を使用して3Dアニメ画像自動取得ツールを作成し、槍兵、槍騎兵、城モデルの全方向アニメ画像を取得します。
テーマ : ゲーム製作 関連 - ジャンル : ゲーム
うまく行きました?
多分あと少しです
予想より手間取ってますが、今日明日中には出来上がると思います。
コメントの投稿