我目前正在将2D游戏转换为3D,在我尝试学习之前从未使用3D。我想知道使用顶点/索引缓冲区的最佳方法是什么。
目前,我正在遍历网格并为每种图块类型创建一组缓冲区,然后在draw方法中使用这些缓冲区。我假设我不应该使用多组顶点缓冲区,但不知道另一种方法,因为每个tile是不同的纹理。
网格循环
for (int i = Convert.ToInt32(xPos / 2) - 30; i < Convert.ToInt32(xPos / 2) + 30; i++)
{
for (int a = Convert.ToInt32(yPos / 2); a < Convert.ToInt32(yPos / 2) + 50; a++)
{
if (mapXtile > 0 && mapYtile > 0 && mapXtile < Globals.mapsizex && mapYtile < Globals.mapsizey)
{
int currentTile = Globals.levelArray[level, mapXtile, mapYtile].TyleType;
if (currentTile == tyleType.grass)
{
createCubeVertices(i * 2, a * 2, 1, 0f, count, grassVertices);
SetUpBufferIndices(count, grassIndices);
count++;
}
if (currentTile == tyleType.water)
{
createCubeVertices(i * 2, a * 2, 1, 0f, count, waterVertices);
SetUpBufferIndices(count, waterIndices);
waterCount++;
}
}
mapYtile = mapYtile + 1;
//mapYtile++;
}
mapXtile = mapXtile + 1;
mapYtile = Convert.ToInt32(yPos / 2);
}
CopyToBuffers(grassVertices, grassIndices);
CopyToWaterBuffers(waterVertices, waterIndices);
绘制代码
foreach (EffectPass pass in grassEffect.CurrentTechnique.Passes)
{
pass.Apply();
device.Indices = myIndexBuffer;
device.SetVertexBuffer(myVertexBuffer);
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, grassVertices.Length, 0, grassIndices.Length/3);
}
foreach (EffectPass pass in mouseEffect.CurrentTechnique.Passes)
{
pass.Apply();
device.Indices = myWaterIndexBuffer;
device.SetVertexBuffer(myWaterVertexBuffer);
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 10000, 0, 10000);
}
非常感谢任何建议。
答案 0 :(得分:0)
如果你在绘制它们时效果相同,你可以使用atlas texture并将所有基元分组到一个唯一的顶点缓冲区中,允许在一次调用中绘制所有基元。
答案 1 :(得分:0)
您的选择:
单个地图集纹理。优点:简单,快速,可以使用默认着色器。缺点:纹理接缝。
Multitexturing。优点:强大而灵活,您可以控制一切。缺点:更复杂,自定义着色器,速度较慢。