在DirectX中绘制多个2d形状

时间:2012-11-07 15:09:24

标签: directx directx-11

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

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

我的流程是:

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

在回答时,请充分了解DirectX和图形编程的基本知识。

3 个答案:

答案 0 :(得分:3)

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

Index Buffers(Direct3D 9)

Rendering from Vertex and Index buffers

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

Geometry Instancing

Efficiently Drawing Multiple Instances of Geometry(D3D9)

答案 1 :(得分:0)

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

虽然没有什么限制你使用单个顶点缓冲区和许多索引缓冲区,但事实上你可能会获得一些性能提升,特别是对于小网格......

答案 2 :(得分:0)

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

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

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);
    ...

}

Remenber all是伪代码,但这应该给你一个想法,但是如果你计划制作很多Triangle有一个问题,让我们说1000个三角形,也许这不是最好的选择,你应该使用DrawIndexed并修改每个三角形的顶点位置,或者你可以使用DrawInstanced,这更简单,只需一次Draw调用就可以发送所有信息,因为调用Draw * triangleCount,对于大量来说非常沉重