我完成了在directx中渲染2d三角形的教程。现在,我想利用我的渲染一个三角形的知识来渲染多个三角形,或者就此而言,屏幕上有多个对象。
我应该创建vertexbuffers和输入布局的列表/堆栈/向量,然后绘制每个对象吗?或者有更好的方法吗?
我的流程是:
在回答时,请充分了解DirectX和图形编程的基本知识。
答案 0 :(得分:3)
你不需要为每个形状创建顶点缓冲区,你可以创建一个来存储所有三角形的所有顶点,然后创建一个索引缓冲区来存储所有形状的所有索引,最后用索引缓冲区绘制它们。 我不熟悉DX11,所以,我只列出了D3D 9的链接供您参考,我认为这个概念是相同的,只是有一些API更改。
Rendering from Vertex and Index buffers
如果三角形的形状相同,只是具有不同的位置或颜色,您可以考虑使用几何实例,这是渲染相同几何体的多个副本的强大方法。
答案 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,对于大量来说非常沉重