我正在尝试在我的游戏中即兴制作一些硬件实例。我希望只用一次绘图调用就能绘制多棵树。
到目前为止,我已经建立了一个包含模型、纹理和矩阵数组的类。每个矩阵对应于游戏世界中一棵树的位置。
我决定在我的类和着色器中使用50个副本的object作为硬编码限制。
我确信生成的矩阵是正确的。将Basic effect与多个draw调用一起使用,并在它们之间切换World矩阵,确实会在正确位置上生成正确数量的树。
我已经尝试了一种暗中射击的方法:
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“关键字时立即结束,这是任何理智的人都会期望的。
我已经试过用谷歌搜索这类问题了,但大多数结果都是处理C++代码(我使用的是C# + XNA),他们解决这个问题的方法基本上是收集所有需要的模型的顶点并将其转发,作为一个巨大的模型使用一个World矩阵位置绘制。
有没有一种可靠的方法来使用着色器上的World矩阵数组来绘制一个模型,或者我必须收集所有的顶点数据并以这种方式进行批处理?
发布于 2014-03-04 07:45:18
XNA有一整部分专门用于硬件实例化。您将需要能够编写自己的着色器,这并不是很难学习。您基本上为着色器提供了一个矩阵数组和一个几何体网格,着色器将为每个世界矩阵创建一次网格。此方法还允许您将多个备用世界矩阵传递给每个实例,例如备用纹理坐标。
https://stackoverflow.com/questions/21938120
复制相似问题