【问题标题】:Drawing Multiple 2d shapes in DirectX在 DirectX 中绘制多个 2d 形状
【发布时间】:2012-10-27 16:04:53
【问题描述】:

我完成了关于在 directx 中渲染 2d 三角形的教程。现在,我想利用我在渲染单个三角形方面的知识来渲染多个三角形,或者就此而言在屏幕上渲染多个对象。

我应该创建一个顶点缓冲区和输入布局的列表/堆栈/向量,然后绘制每个对象吗?或者有更好的方法吗?

我的流程是:

  • 设置 directx,包括顶点和像素着色器
  • 为必须在屏幕上绘制的每个形状创建顶点缓冲区并将它们存储在一个数组中。
  • 将它们绘制到每一帧(每一帧)的渲染目标
  • 呈现渲染目标(每一帧)

请在回答时假设您对 DirectX 和图形编程有非常基本的了解。

【问题讨论】:

    标签: directx directx-11


    【解决方案1】:

    您只需要一个顶点缓冲区来执行此操作,然后对它们进行批处理,

    所以这是你可以做的,你可以制作一个数组/向量来保存三角形信息,比如说(伪代码)

    struct TriangleInfo{
      ..... texture;
      vect2 pos;
      vect2 dimension;
      float rot;
    
    }
    

    然后在你的绘制方法中

    for(int i=0; i < vector.size(); i++){
    
        TriangleInfo tInfo = vector[i];
        matrix worldMatrix = Transpose(matrix(tInfo.dimension) * matrix(tInfo.rot) * matrix(tInfo.pos));
    
        shaderParameters.worldMatrix = worldMatrix; //info to the constabuffer
    
        ..
        ..
        dctx->PSSetShaderResources(0, 1, &tInfo.texture);
        dctx->Draw(0,4);
    }
    

    然后在你的顶点着色器中:

    cbuffer cbParameters : register( b0 ) { 
        float4x4 worldMatrix; 
    };
    
    VOut main(float4 position : POSITION, float4 texCoord : TEXCOORD)
    {
        ....
        output.position = mul(position,worldMatrix);
        ...
    
    }
    

    记住所有都是伪代码,但这应该给你的想法,但如果你打算制作很多三角形,比如1000个三角形,可能会出现问题,也许这不是最好的选择,你应该使用DrawIndexed 和修改每个三角形的顶点位置,或者您可以使用 DrawInstanced ,更简单,能够在一次 Draw 调用中发送所有信息,因为调用 Draw * triangleCount ,对于大量而言非常繁重

    【讨论】:

      【解决方案2】:

      你不需要为每个形状创建顶点缓冲区,你可以只创建一个来存储所有三角形的所有顶点,然后创建一个索引缓冲区来存储所有形状的所有索引,最后用索引缓冲区绘制它们. 我对 DX11 不熟悉,所以,我只是列出了 D3D 9 的链接供您参考,我认为概念是相同的,只是 API 有所更改。

      Index Buffers(Direct3D 9)

      Rendering from Vertex and Index buffers

      如果三角形的形状相同,只是位置或颜色不同,可以考虑使用几何实例化,这是渲染相同几何的多个副本的有效方法。

      Geometry Instancing

      Efficiently Drawing Multiple Instances of Geometry(D3D9)

      【讨论】:

        【解决方案3】:

        我对 DirectX 了解不多,但在 GPU 上渲染的一般规则是为每个网格使用单独的顶点和索引缓冲区。

        虽然没有什么限制您将单个顶点缓冲区与许多索引缓冲区一起使用,但实际上您可能会获得一些性能提升,尤其是对于小型网格......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-07
          • 2022-12-09
          相关资源
          最近更新 更多