使用World矩阵数组的XNA模型实例化

时间:2014-02-21 15:14:09

标签: c# matrix xna

我正试图在游戏中即兴创作某种硬件实例。我希望只用一次Draw Call绘制多棵树。

到目前为止,我已经建立了一个包含模型,纹理和矩阵数组的类。每个矩阵对应于游戏世界中一棵树的位置。

我决定在我的班级和着色器中使用50份对象作为硬编码限制。

我确信生成的矩阵是正确的。使用具有多个绘制调用的基本效果并在它们之间切换世界矩阵确实可以在正确的位置产生正确数量的树。

我尝试过一种黑暗的方法:

float4x4 View;
float4x4 Projection;
float4x4 World[50];

...

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
    VertexShaderOutput output[50];

    for (int i=0; i<50; i++)
    {
        float4 worldPosition = mul(input.Position, World[i]);
        float4 viewPosition = mul(worldPosition, View);
        output[i].Position = mul(viewPosition, Projection);
        output[i].texCoord = input.texCoord;

        return output[i];
    }

}

令我惊讶的是,这确实编译了,更令人惊讶的是,并没有融化我的GPU。

没有那么大的惊喜,这只会绘制一棵树,第一个树,因为一旦它按照任何理智的头脑所期望的那样点击“return”关键字就会结束循环。

我尝试使用google搜索此类问题的google-fu技能,但大部分结果都是处理C ++代码(我使用的是C#+ XNA),他们解决问题的方法基本上是收集所有需要的模型顶点并转发所有这些,作为一个用一个世界矩阵位置绘制的巨大模型。

是否有可靠的方法在着色器上使用World矩阵数组绘制一个模型,或者我是否必须收集所有顶点数据并按此方式批量处理?

1 个答案:

答案 0 :(得分:0)

XNA的一部分专用于硬件实例化。您需要能够编写自己的着色器,这不是非常难以学习。您基本上为着色器提供了一个矩阵数组和一个几何网格,着色器将为每个世界矩阵设置一次网格。此方法还允许您向每个实例传递多个替代世界矩阵,例如替代纹理坐标。