1

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

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

我的过程是:

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

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

4

3 回答 3

3

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

索引缓冲区(Direct3D 9)

从顶点和索引缓冲区渲染

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

几何实例化

有效地绘制多个几何实例(D3D9)

于 2012-11-08T01:42:00.303 回答
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);
    ...

}

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

于 2014-01-16T11:47:49.837 回答
0

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

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

于 2012-11-07T15:26:21.927 回答