gpt4 book ai didi

c# - SharpDX 中的动态顶点缓冲区

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:23 26 4
gpt4 key购买 nike

我在弄清楚如何使用 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 的新手,网络上的 DirectX9 教程对我使用 DirectX11.1 的帮助不大。

谢谢

最佳答案

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

是错误的,因为你想要 10000 个顶点,但分配了 10000 个字节,所以应该是:

 10000 * sizeof(Vector4) * 2

根据您的输入布局。

同样要写入您的缓冲区,您应该改为查看 context.MapSubresource。

关于c# - SharpDX 中的动态顶点缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12034956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com