使用SharpDX从DirectX 11中的多个顶点缓冲区进行绘制

潘卡斯基

1)问题

我想绘制点负载图。数据集不是静态的,并且点在流动。目前,我将图形存储在顶点缓冲区中,并在它们出现时立即添加新点。问题是缓冲区空间不足时。也许此刻我将太多数据传递到缓冲区,但是我可以将其设置为的最大大小为

   int buffer_size = 1215 * (Utilities.SizeOf<Vector4>() 
                           + Utilities.SizeOf<Vector4>() 
                           + Utilities.SizeOf<Vector2>());

等于48 600

对于48 640,我得到一个错误

A first chance exception of type 
'System.AccessViolationException' occurred in SharpDX.Direct3D11.dll
Additional information: There was try to read or write to/from protected memory

我的想法是创建两个Vertex Buffer,如果其中一个完全写入第二个Vertex Buffer,则仍然要绘制它们。编写时将带有标志MapMode.WriteNoOverwrite如果第二个已满,则使用标志MapMode.WriteDiscard写入第一个中的第一个单元,这将基本上清除缓冲区。

2)问题:

如何从多个顶点缓冲区写入?

3)现有代码

我设置了一个包含两个插槽信息的布局:

var layout = new InputLayout(device, passSignature, new InputElement[]
    {
      new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0)
     ,new InputElement("COLOR", 0, Format.R32G32B32A32_Float
                              , InputElement.AppendAligned, 0)
     ,new InputElement("TEXCOORD", 0, Format.R32G32_Float
                              , InputElement.AppendAligned, 0)

     // semantic index had also to be increased as has a slot number
     ,new InputElement("POSITION",1, Format.R32G32B32A32_Float, 0, 1)
     ,new InputElement("COLOR", 1, Format.R32G32B32A32_Float  
                              , InputElement.AppendAligned, 1)
     ,new InputElement("TEXCOORD", 1, Format.R32G32_Float
                                 , InputElement.AppendAligned, 1)
    });

创建缓冲区的数据并设置顶点缓冲区。

    float[] buffer_data = new float[] {
          -1.0f,   0.0f,  0.0f, 1.0f,   1.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f
         , 0.2f,  -0.4f,  0.0f, 1.0f,   0.0f, 1.0f, 0.0f, 0.0f,    0.0f, 0.0f 
         ......

    var vertices = Buffer.Create(device
                                    , BindFlags.VertexBuffer
                                    , buffer_data
                                    , buffer_size
                                    , ResourceUsage.Dynamic
                                    , CpuAccessFlags.Write
                                    , ResourceOptionFlags.None
                                    , 0);

    context.InputAssembler.InputLayout = layout;
    context.InputAssembler.PrimitiveTopology = PrimitiveTopology.LineList;
    context.InputAssembler.SetVertexBuffers(
                         0
                       , new Buffer[] { vertices, vertices2 }
                       , new int[] { 40, 40 }
                       , new int[] {  0,  0 }
    );    

画画

int sectionsToDraw = 32;
context.ClearRenderTargetView(renderView, Color.Black);

// Main loop            
RenderLoop.Run(form, () =>
{
    for (int i = 0; i < technique.Description.PassCount; ++i)
    {
        pass.Apply(context);
        context.PixelShader.SetShaderResource(0, textureView);
        context.GeometryShader.SetConstantBuffer(0, _constantBuffer);
        context.Draw(sectionsToDraw,0);  
    }
    swapChain.Present(0, PresentFlags.None);
});

和我的着色器的结构

struct VS_IN 
{
    float4 pos : POSITION;
    float4 col : COLOR;
    float2 tex : TEXCOORD;
};

struct GS_IN
{
    float4 pos : SV_POSITION;
    float4 col : COLOR;
    float2 tex : TEXCOORD;
};

struct PS_IN
{
    float4 pos : SV_POSITION;
    float4 col : COLOR;
    float2 tex : TEXCOORD;
};

我不知道如何从第一个插槽中抽奖。它仅从插槽1中的缓冲区中提取。

问题不在于:-在两个缓冲区中绘制点的正确设置-传递给contect.Draw的绘制顶点数-第一个参数中的绘制-我还尝试过更改着色器的结构以使用POSITION1或COLOR1,但是没有帮助,但也许我没有正确执行。

潘卡斯基

我仅通过在render函数中的InputAssambler中切换缓冲区就设法从两个Vertex缓冲区中绘制

VertexBufferBinding vb = new VertexBufferBinding(vertices
                         , Utilities.SizeOf<Vector4>() 
                         + Utilities.SizeOf<Vector4>() 
                         + Utilities.SizeOf<Vector2>()
                         , 0);

VertexBufferBinding vb2 = new VertexBufferBinding(vertices2
                         , Utilities.SizeOf<Vector4>() 
                         + Utilities.SizeOf<Vector4>() 
                         + Utilities.SizeOf<Vector2>()
                         , 0);

然后在渲染循环中

RenderLoop.Run(form, () =>
{
   context.ClearRenderTargetView(renderView, Color.Black);  
   .... 
   context.InputAssembler.SetVertexBuffers(0, vb);                              
   context.Draw(sectionsToDraw,0);
   context.InputAssembler.SetVertexBuffers(0, vb2);
   context.Draw(sectionsToDraw, 0);
   ....
}

当然,使用此解决方案还可以简化布局

var layout = new InputLayout(device, passSignature, new InputElement[]
    {
      new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0)
     ,new InputElement("COLOR",    0, Format.R32G32B32A32_Float
                              , InputElement.AppendAligned, 0)
     ,new InputElement("TEXCOORD", 0, Format.R32G32_Float
                              , InputElement.AppendAligned, 0)
    }

但是现在,我不确定我的解决方案是否不涉及在每次绘制调用时都复制整个缓冲区。我必须多读一些。

我认为我的问题是我正在使用Directx 11,并且找不到局部缓冲区锁,就像我在Directx 9中发现的那样。http: //sharpdx.org/documentation/api/m-sharpdx -direct3d9-vertexbuffer-lock在DirectX 11中似乎没有。我发现可以使用资源的MapSubresource,但是根据MSDN, “缓冲区定义为单个子资源”。因此,不可能像我想要的那样仅锁定缓冲区的一部分。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在DirectX11中为动态和静态对象使用单独的顶点缓冲区

来自分类Dev

使用 DirectX11 更新非 UI 线程中的顶点缓冲区

来自分类Dev

Directx11如何管理多个顶点/索引缓冲区?

来自分类Dev

非交错顶点缓冲区DirectX11

来自分类Dev

使用单个顶点缓冲区还是多个顶点缓冲区?

来自分类Dev

使用单个顶点缓冲区还是多个顶点缓冲区?

来自分类Dev

(DirectX 11)单个顶点缓冲区可以一次绑定到多个IA输入插槽吗?

来自分类Dev

是否可以在DirectX DC /缓冲区上使用opengl进行绘制?

来自分类Dev

如何在Webgl的缓冲区中仅使用4个顶点绘制2个嵌套矩形?

来自分类Dev

顶点和索引缓冲区如何在 DirectX11 中与顶点、法线和 Texcords 一起工作

来自分类Dev

常量缓冲区DirectX 11

来自分类Dev

DirectX顶点缓冲区默认与默认+过渡

来自分类Dev

使用SharpDX的Directx 11.2 Mipmap?

来自分类Dev

WPF中DirectX11中的SharpDX 2.5

来自分类Dev

Drawing from multiple vertex buffers in DirectX 11 with SharpDX

来自分类Dev

Directx 11 with C ++:使用常量缓冲区和SetRawValue()之间的区别?

来自分类Dev

DirectX11更新动态实例缓冲区

来自分类Dev

使用顶点缓冲区对象的最低OpenGL ES版本

来自分类Dev

OpenGL无法使用VAO过程更新顶点缓冲区

来自分类Dev

无法使用lwjgl和顶点缓冲区渲染纹理

来自分类Dev

使用vulkan进行绘制调用之间的存储缓冲区同步

来自分类Dev

在OpenGL中使用不同的缓冲区绘制多个对象

来自分类Dev

如何通过使用统一的缓冲区对象和实例渲染来绘制多个对象?

来自分类Dev

如何使用Directx读取hdmi输入帧缓冲区?

来自分类Dev

DirectX HLSL-像素着色器中恒定缓冲区为空,但顶点着色器中为空

来自分类Dev

在 Flex 中使用多个缓冲区时,如何避免令牌在缓冲区之间拆分

来自分类Dev

将文件写入磁盘并使用缓冲区时,C中的分段错误11

来自分类Dev

使用 pybind11 从 C++ 反序列化 Python 中的 protobuf 缓冲区

来自分类Dev

OpenGL绘制顶点缓冲区对象

Related 相关文章

  1. 1

    在DirectX11中为动态和静态对象使用单独的顶点缓冲区

  2. 2

    使用 DirectX11 更新非 UI 线程中的顶点缓冲区

  3. 3

    Directx11如何管理多个顶点/索引缓冲区?

  4. 4

    非交错顶点缓冲区DirectX11

  5. 5

    使用单个顶点缓冲区还是多个顶点缓冲区?

  6. 6

    使用单个顶点缓冲区还是多个顶点缓冲区?

  7. 7

    (DirectX 11)单个顶点缓冲区可以一次绑定到多个IA输入插槽吗?

  8. 8

    是否可以在DirectX DC /缓冲区上使用opengl进行绘制?

  9. 9

    如何在Webgl的缓冲区中仅使用4个顶点绘制2个嵌套矩形?

  10. 10

    顶点和索引缓冲区如何在 DirectX11 中与顶点、法线和 Texcords 一起工作

  11. 11

    常量缓冲区DirectX 11

  12. 12

    DirectX顶点缓冲区默认与默认+过渡

  13. 13

    使用SharpDX的Directx 11.2 Mipmap?

  14. 14

    WPF中DirectX11中的SharpDX 2.5

  15. 15

    Drawing from multiple vertex buffers in DirectX 11 with SharpDX

  16. 16

    Directx 11 with C ++:使用常量缓冲区和SetRawValue()之间的区别?

  17. 17

    DirectX11更新动态实例缓冲区

  18. 18

    使用顶点缓冲区对象的最低OpenGL ES版本

  19. 19

    OpenGL无法使用VAO过程更新顶点缓冲区

  20. 20

    无法使用lwjgl和顶点缓冲区渲染纹理

  21. 21

    使用vulkan进行绘制调用之间的存储缓冲区同步

  22. 22

    在OpenGL中使用不同的缓冲区绘制多个对象

  23. 23

    如何通过使用统一的缓冲区对象和实例渲染来绘制多个对象?

  24. 24

    如何使用Directx读取hdmi输入帧缓冲区?

  25. 25

    DirectX HLSL-像素着色器中恒定缓冲区为空,但顶点着色器中为空

  26. 26

    在 Flex 中使用多个缓冲区时,如何避免令牌在缓冲区之间拆分

  27. 27

    将文件写入磁盘并使用缓冲区时,C中的分段错误11

  28. 28

    使用 pybind11 从 C++ 反序列化 Python 中的 protobuf 缓冲区

  29. 29

    OpenGL绘制顶点缓冲区对象

热门标签

归档