[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
public void CopyResource(Resource source, Resource destination);これは珍しく簡単なメソッドで、解説の必要は無いかもしれません。
OptionFlags = ResourceOptionFlags.StructuredBuffer, StructureByteStride = 配列要素一つのサイズとしてやることでStructuredBufferにすることができます。
ResourceOptionFlagsの値 | 数値 | 説明 |
None | 0 | オプションの指定はなしです。 |
GenerateMipMaps | 1 | 生成するリソースががテクスチャの場合、mipmapの生成を有効にします。これを使う場合、BindFlagsでこのリソースがレンダーターゲットであり、シェーダーリソースであるということを指定しなければいけません。 |
Shared | 2 | 生成するリソースが複数のDirect3Dデバイス間でのデータ共有することを可能にします。ただし2Dのテクスチャでなくてはいけません。 |
TextureCube | 4 | 生成するリソースが6枚のテクスチャから成る、テクスチャキューブになることを可能にします。 |
DrawIndirect | 16 | GPUで生成されたコンテントのインスタンシングを可能にします。たぶんインスタンシングを使って描画するので、直接描画するわけではない、ということなのでしょう。 |
RawBuffer | 32 | 生成するリソースが、ひとかたまりの、バイトアドレスで操作するバッファでになることを可能にします。 |
StructuredBuffer | 64 | 生成するリソースが、Structured Bufferとなることを可能にします。たくさんの構造体が並んだ配列のようなものです。 |
ClampedResource | 128 | DeviceContext.SetMinimumLod()メソッドを使ったときに、mipmapのclampを有効にします。 |
KeyedMutex | 256 | SlimDX.DXGI.KeyedMutexクラスの、KeyedMutex.Acquire()メソッドとKeydMutex.Release()メソッドを使ったときに、シンクロするようになります。 |
GdiCompatible | 512 | リソースがGDIと互換性を持てます。これを指定するとSlimDX.Direct2D.GdiInteropRenderTargetクラスのGetDC()メソッドを使ってGDIで描画できます。 |
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 onlyGpuBuffer = createStructuredBuffer(device, Enumerable.Range(10, 10).ToArray()); writeBuffer(device, onlyGpuBuffer); } static void writeBuffer(Device device, Buffer buffer) { Buffer cpuAccessibleBuffer = createCpuAccessibleBuffer(device, Enumerable.Range(0, 10).ToArray()); device.ImmediateContext.CopyResource(buffer, cpuAccessibleBuffer); int[] readBack = readBackFromGpu(cpuAccessibleBuffer); foreach (var number in readBack) { System.Console.WriteLine(number); } } static Buffer createStructuredBuffer(Device device, int[] initialData) { DataStream initialDataStream = new DataStream(initialData, true, true); return new Buffer( device, initialDataStream, new BufferDescription { SizeInBytes = (int)initialDataStream.Length, OptionFlags = ResourceOptionFlags.StructuredBuffer, StructureByteStride = sizeof(int) } ); } 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; } }このプログラムはまず、
10 11 12 13 14 15 16 17 18 19ここで表示されているのは