首页 文章

在DirectX中绘制多个2d形状

提问于
浏览
1

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

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

我的过程是:

  • 设置directx,包括顶点和像素着色器

  • 为必须在屏幕上绘制的每个形状创建顶点缓冲区并将它们存储在数组中 .

  • 将它们绘制到每帧(每帧)的渲染目标

  • 呈现渲染目标(每帧)

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

3 回答

  • 3

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

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

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

  • 0

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

    Index Buffers(Direct3D 9)

    Rendering from Vertex and Index buffers

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

    Geometry Instancing

    Efficiently Drawing Multiple Instances of Geometry(D3D9)

  • 0

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

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

相关问题