プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
画像ファイル統合失敗
統合試行中の画像
アニメのコマ割りのように少しずつ変化させるつもりが、全て同じ画像になってしまっている(失敗)。



◎ごあいさつ

大変遅くなりましたが、あけましておめでとうございます。

年末年始や大戦略Webの影響でしばらく更新をサボってしまいましたが、ぼちぼち再開しますので今年もよろしくお願い致します。



◎統合方式の検討

今回は画像ファイルを統合します。読み込み速度の向上が当面の目的ですが、後日モデルインスタンシングで画面表示パフォーマンスを高めるための布石でもあります。
(マテリアル数を減らした方が効果的)

画像ファイルを統合するには、下記の方法があります。

A案:画像ファイルを結合するツールを作成する
B案:連画出力ツール内で結合するように改修する

A案の方が簡単に作れそうですが、画像出力時に2つのツールを動かすことになります。使う際の手間を極力減らしたいので、B案にしましょう。



◎グラフィックデバイス管理

連画出力ツールの改修を始めたものの、予想通り難航しました(--;

RenderTarget2Dで画像を1枚ずつキャプチャし、これを配列に保存する所まではできたのですが、RenderTarget2Dのインスタンスをもう1つ作成し、これに縦横16枚ずつ画像を並べて1枚の大きな画像を取得しようとすると、出力されたキャプチャ画像には、槍兵が1体大きく表示されました。

大きな槍兵

このような画像ファイルが出力されたので、最初は画像を並べる部分を失敗したか、或いはレンダーターゲットの切り替えに失敗したかと思ったのですが、それ以前にグラフィックデバイス管理の概念が予想と異なるようです。

どうやら1度のDraw()内で2回以上切り替えても無意味らしいので、個別画像キャプチャと統合画像キャプチャのタイミング(scene)を分けることにしました。



◎ドはまり

全ての画像のキャプチャを終えてから、それらの画像を縦横に並べて表示すると、全て同じ画像になってしまいました。

画像ファイル統合失敗

アニメのコマ割りのようになって欲しかったのですが、何故全て同じ画像なのでしょうか?

画像を並べるプログラムがおかしい?
レンダーターゲットの制御ミス?
Softimageランタイムの影響?
そもそも画像が取得できていない?
……

正月ボケした頭には難しすぎて長期間ハマってしまったのですが、ようやく原因が判明しました。



◎原因

レンダーターゲットから画像を取得し、配列に格納します。

private Texture2D[] capturedTexture = new Texture2D[1024];
……
(省略)
……
capturedTexture[nowPic] = renderTarget.GetTexture();


このように格納した画像配列のハッシュコードを表示すると、全て同じ値になってました。

i = 0 GetHashCode = 35191196
i = 1 GetHashCode = 35191196
i = 2 GetHashCode = 35191196
i = 3 GetHashCode = 35191196
……


どうやら、1つのレンダーターゲットから取得した画像は全て同じ参照値で返されてしまうようですね。



◎試行その1

取得したい画像の数だけレンダーターゲットを用意できればこの問題は解消されますが…500枚の画像を取得する場合、500個のレンダーターゲットを用意する必要があります。そんなことが可能でしょうか?

試しにレンダーターゲットを500個作成しようとしたら、47個目あたりで OutOfVideoMemoryException エラーになりました。ビデオメモリが足りないようです。無理もありませんね(^^;



◎試行その2

次に考えたのは、予め退避&保存用のレンダーターゲットを作成しておき、画像を1枚取得する毎にそちらに書き込む、という方法です。

・画像取得用レンダーターゲット
・退避保存用レンダーターゲット
・バックバッファー

上記3つのレンダーターゲットを切り替えて、取得した画像を退避保存用レンダーターゲットに書き込んだのですが、保存したファイルには何も描かれませんでした。

画面には描き込んだ場所にだけ一瞬表示されるので、退避保存用レンダーターゲットが毎回自動消去されるようです。



◎次回予告

ようやく原因を特定したものの、取得した画像データをメモリ内に退避する方法が思い付きません。仕方がないので、B案は諦めてA案にしようと思います。

1月になったので、次回は「12月の総括と1月の目標」です。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。