2014-09-05 4 views
1

В настоящее время я преобразовываю 2D-игру в 3D, никогда не работая с 3D, прежде чем пытаюсь учиться, когда я иду. Мне интересно, что лучший способ использовать буферы вершин/индексов.XNA Buffer Best Practice

В настоящее время я перебираю сетку и создаю набор буферов для каждого типа плитки, которые затем используются в методе рисования. Im предполагая, что я не должен использовать несколько наборов вершинных буферов, но не знаю другого способа сделать это, поскольку каждая плитка - это другая текстура.

Сетка петля

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

Ваших вариантов:

  1. Одиночного атлас текстура. Преимущества: простые, быстрые, стандартные шейдеры могут использоваться. Недостатки: текстурные швы.

  2. Мультитекстурирование. Преимущества: мощный и гибкий, вы все контролируете. Недостатки: более сложные, пользовательские шейдеры, медленнее.

0

Если вы используете тот же эффект для их рисования, вы можете использовать atlas texture и объединить все примитивы в один уникальный вертексбуфер, позволяющий рисовать все за один раз.