2

SharpDX を使用して動的 VertexBuffer と IndexBuffer を設定する方法を理解するのに大きな問題があります。

ユーザーが画面上で押すたびに三角形を生成する必要があります。

画面座標を投影座標に変換する変換関数を設定する必要があると思います。

しかし、ここまで来ることはありません...

10000 個の頂点用のスペースを持つバッファーをセットアップしたいと考えています。

layout = new InputLayout(d3dDevice, vertexShaderByteCode, new[]
{
    new SharpDX.Direct3D11.InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
    new SharpDX.Direct3D11.InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0)
});

vb = Buffer.Create(d3dDevice, BindFlags.VertexBuffer, stream, 10000, ResourceUsage.Dynamic, CpuAccessFlags.Write);

vertexBufferBinding = new VertexBufferBinding(vb, Utilities.SizeOf<Vector4>() * 2, 0);

そのバッファは、次を使用して新しい三角形を追加する必要があるたびに更新したい:

d3dDevice.ImmediateContext.UpdateSubresource(updateVB, vb);

updateVB は、追加される新しい三角形です。

レンダリングは次のように機能します。

// Prepare matrices
var view = Matrix.LookAtLH(new Vector3(0, 0, -5), new Vector3(0, 0, 0), Vector3.UnitY);
var proj = Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, width / (float)height, 0.1f, 100.0f);
var viewProj = Matrix.Multiply(view, proj);

// Set targets (This is mandatory in the loop)
d3dContext.OutputMerger.SetTargets(render.DepthStencilView, render.RenderTargetView);

// Clear the views
d3dContext.ClearDepthStencilView(render.DepthStencilView, DepthStencilClearFlags.Depth, 1.0f, 0);

d3dContext.ClearRenderTargetView(render.RenderTargetView, Colors.Black);

// Calculate WorldViewProj
var worldViewProj = Matrix.Scaling(1f) * viewProj;
worldViewProj.Transpose();

// Setup the pipeline
d3dContext.InputAssembler.SetVertexBuffers(0, vertexBufferBinding);
d3dContext.InputAssembler.InputLayout = layout;
d3dContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

d3dContext.VertexShader.Set(vertexShader);
d3dContext.PixelShader.Set(pixelShader);

d3dContext.Draw(vertexCount, 0);

私は DirectX を初めて使用し、Web 上の DirectX9 チュートリアルは、DirectX11.1 についてはあまり役に立ちません。

ありがとう

4

1 に答える 1

1
vb = Buffer.Create(d3dDevice, BindFlags.VertexBuffer, stream, 10000, ResourceUsage.Dynamic, CpuAccessFlags.Write);

10000 個の頂点が必要ですが、10000 バイトを割り当てるため、次のようにする必要があります。

 10000 * sizeof(Vector4) * 2

入力レイアウトに応じて。

また、バッファに書き込むには、代わりに context.MapSubresource を確認する必要があります。

于 2012-10-14T15:41:31.277 に答える