[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
using System.Collections.Generic; using System.Linq; using SlimDX; using SlimDX.Direct3D11; class Program { static void Main(string[] args) { Device device = new Device(DriverType.Hardware); Buffer buffer = createCpuAccessibleBuffer(device, Enumerable.Range(0, 10).ToArray()); int[] readBack = readBackFromGpu(buffer); foreach (var number in readBack) { System.Console.WriteLine(number); } } private static Buffer createCpuAccessibleBuffer(Device device, int[] initialData) { DataStream initialDataStream = new DataStream(initialData, true, true); return new Buffer( device, initialDataStream, new BufferDescription { SizeInBytes = (int)initialDataStream.Length, CpuAccessFlags = CpuAccessFlags.Read, Usage = ResourceUsage.Staging } ); } static int[] readBackFromGpu(Buffer from) { DataBox data = from.Device.ImmediateContext.MapSubresource( from, MapMode.Read, MapFlags.None ); return getArrayInt32(data.Data); } static int[] getArrayInt32(DataStream stream) { int[] buffer = new int[stream.Length / sizeof(int)]; stream.ReadRange(buffer, 0, buffer.Length); return buffer; } }コードはこれだけです。
0 1 2 3 4 5 6 7 8 9ここで表示しているのはGPUにあるバッファの内容をCPU側に写しとった配列です。
public class Device : ComObjectコンストラクタは8個用意されていますが、今回必要なのは
public Device(DriverType driverType);deviceTypeはデバイスの種類で、つぎの6つの中から選びます。
DeviceTypeの値 | 説明 |
Unknown | タイプが不明 |
Hardware | Direct3Dの機能を持つハードウェアです。まずほとんどのばあいこれを使ってDeviceクラスを初期化することになります。ハードウェアを使うためかなり速いです。というかこれ以外では遅すぎてまず通常目的では使えません。これを使いましょう。 |
Reference | リファレンスドライバです。リファレンスドライバはソフトウェアで動いているため遅いです。遅いです―が正確で、デバッグ時やDirectXの機能をテストするというようなときには悪くはないのかもしれません。ただ、実際のアプリケーションで使う為のものではありません。 |
Null | Nullドライバです。これはリファレンスドライバから描画機能がなくなったようなものです。これもデバッグ用で、まず普通のアプリケーションで使うためのものではありません。 |
Software | Softwareドライバです。これは完全にソフトウェアで実装されています。やはり遅いため普通のアプリケーションで使うためのものではありません。 |
Warp | WARPドライバです。これもソフトウェアで動きますが、パフォーマンスは高いです。 |
public DeviceContext ImmediateContext { get; }と、いうよりDeviceクラスはほとんど抜け殻のようなもので、
public class Buffer : ResourceこのバッファというものはGPUに存在するデータの塊のようなもので、
public Buffer(Device device, DataStream data, BufferDescription description);deviceはこのバッファを作るデバイスです。
public class DataStream : Stream, IDisposableコンストラクタは3種類用意されていますが、
public DataStream(Array userBuffer, bool canRead, bool canWrite);
public T[] ReadRange(int count) where T : struct; public int ReadRange (T[] buffer, int offset, int count) where T : struct;
プロパティ名 | 型 | 説明 |
BindFlags | BindFlags | パイプライン中でどのように使われるか、を表します。 たとえば頂点バッファとして使われるか?インデックスバッファとして使われるか?定数バッファとして使われるのか?シェーダーのリソースとして使われるのか?ストリームの出力として使われるのか?レンダーターゲットとして使われるのか?デプスステンシルバッファとして使われるのか?アンオーダードアクセス(複数のスレッドから同時に読み書き可能な)リソースとして使われるのか? ・・・・・・などです |
CpuAccessFlags | CpuAccessFlags | このバッファにCPUがいかほどのアクセス権限を持っているかを表します。None, Write, Readの3種類があります。 |
OptionFlags | ResourceOptionFlags | その他のオプションです。 たとえば、MipMapを生成するか?複数のデバイス間で共有されるか?TextureCubeか?インスタンシングを有効にするか?RawBufferか?StructuredBufferか?深度バイアスはどうするか?KeyedMutexか?GDIと互換性があるか? ・・・・・・などです。 |
SizeInBytes | int | バッファが何バイトか、を表します。 |
StructureByteStride | int | StructuredBufferとして使用する場合(OptionFlagsでそのように指定するのですが)に使います。ひとつの構造体のサイズが何バイトかを表します。 |
Usage | ResourceUsage | バッファの使われ方を表します。GPUが読み書きのできるDefault、GPUで読み取りのみ可能なImmutable、GPUからは読み取りのみCPUからは書き込みのみのDynamic、GPUからCPUへデータを転送できるStagingの4つです。 |
public DataBox MapSubresource( Resource resource, MapMode mode, MapFlags flags);resourceはメモリに展開するリソース、今回の場合はバッファです。
MapModeの名前 | 説明 |
Read | リソースは読み取り用にマップされます。ただしリソースが読み取りアクセス可能なように生成されていなければいけません。 |
Write | リソースは書き込み用にマップされます。ただしリソースが書き込みアクセス可能なように生成されていなければいけません。 |
ReadWrite | リソースは読み書き用にマップされます。ただしリソースが読み書きアクセス可能なように生成されていなければいけません。 |
WriteDiscard | リソースは書き込み用にマップされますが、以前の情報は未定義になります。ただしリソースが書き込みアクセス可能なように生成されていなければいけません。 |
WriteNoOverwrite | リソースは書き込み用にマップされますが、リソースのすでに存在しているコンテンツは上書きできません。このフラグは頂点バッファとインデックスバッファでのみ有効です。リソースは書き込みアクセス可能なように生成されていなければいけません。 |
MapFlagsの名前 | 説明 |
None | リソースが使えるようになるまで待ちます。 |
DoNotWait | リソースが使えるようになるまで待ちません。GPUがCPUからのアクセスをブロックするようであればWasStillRenderingを返します。 |
public DataStream Data { get; }DataはSystem.IO.Streamを継承したSlimDX.DataStreamクラスです。