2012-11-07 97 views
1

我完成了一个关于在directx中渲染2D三角形的教程。现在,我想用我的知识渲染一个三角形来呈现多个三角形,或者就此而言,屏幕上有多个对象。在DirectX中绘制多个2D图形

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

我的过程将是:

  • 设置的DirectX,包括顶点和像素着色器对具有在屏幕上绘制,并将它们存储在一个阵列中的每个形状
  • 创建顶点缓冲器。
  • 吸引他们到渲染目标的每一帧(每帧)
  • 目前的渲染目标(每一帧)

回答时,请假设一般DirectX和图形编程的非常基本的知识。

回答

0

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

虽然没有什么使用单个顶点缓冲区与许多索引缓冲区限制你,其实你可能会得到一些性能提升尤其是对小网格...

3

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

Index Buffers(Direct3D 9)

Rendering from Vertex and Index buffers

如果三角形在相同的形状,只是不同的位置或颜色,您可以考虑使用几何实例,它是呈现几何形状相同的多个副本的有效方式。

Geometry Instancing

Efficiently Drawing Multiple Instances of Geometry(D3D9)

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都是伪代码,但是这应该给你的想法,但如果你是刨去让很多三角形的问题,假设有1000个三角形,也许这不是最好的选择,您应该使用DrawIndexed并修改每个三角形的顶点位置,或者可以使用更简单的DrawInstanced来发送所有信息。Draw call ,因为调用Draw * triangleCount,对于大数量来说非常沉重