C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

SlimDX.D3D9を使いGPUで描画した結果をCPUで取得する

相変わらず海外を含めてサンプルが見つからない。

SlimDXでGPGPUをDX9のまま実装するため
描画済みのテクスチャを取得する方法を置いとく

描画メソッド内に以下の内容を実行すると、取得ができる。

テスト用のメソッドなので、ビットマップの保存や、
巨大な配列の宣言とかは適宜修正してくりゃれ。


//レンダーターゲットを用意する
renderTexture = new Texture(device, this.ClientSize.Width, this.ClientSize.Height, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default);
renderSurface = renderTexture.GetSurfaceLevel(0);

//レンダーターゲットを保存する
oldRenderSurface = device.GetRenderTarget(0);

//レンダーターゲットを変更する
device.SetRenderTarget(0, renderSurface);

//画面を初期化
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
device.BeginScene();

//データを流しこんで描画
device.SetStreamSource(0, vertices, 0, Marshal.SizeOf(typeof(Vertex)));
device.VertexDeclaration = vertexDecl;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

//レンダーターゲットを元に戻す
device.SetRenderTarget(0, oldRenderSurface);
oldRenderSurface.Dispose();

//ストリームを用意
DataStream stream = Texture.ToStream(renderTexture, ImageFileFormat.Bmp); //ファイルストリームと等価

//ビットマップとして流しこむ
Bitmap bmp = (Bitmap)Bitmap.FromStream(stream, false, false);

//内容を保存して確認
bmp.Save("test.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

//直接バイト型として参照も可能
byte[] bs = new byte[stream.Length / sizeof(byte)];
stream.Read(bs, 0, bs.Length);

device.EndScene();
device.Present();



はっきり言って暗中模索のなか、どうにか実行できているレベルなので、
このままでは問題が起こる可能性が多分にある。

メモリリークの可能性や、その他何か気づいた点があったら、
遠慮なくコメントからツッコミをお願いします。


蛇足:
国内のサンプルは何故かテクスチャを
一生懸命BitmapクラスやらImageクラスからメモリ通して作ってるけど、
なんで
Texture tex = Texture.FromFile(device, filePath);
を使わないんじゃろうか・・・

低速であっても、どうせ初期化の一回きりの処理だし、
気にならないと思うんだけど、何か理由があるんだろうか・・・
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

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

トラックバック

http://t01a.dtiblog.com/tb.php/139-ac3ea04f

« Windows7でWindowsXPのペイントを使う  | HOME |  超ニッチなエクセルグラフの作り方 »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2017-06 | »
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約