måndag 27 oktober 2008

En intelligent terräng

Det var ett tag sen jag skrev. Under de senaste tiden har jag jobbat på att utvecklat min terräng rejält.

En rödfärgad terräng är inte speciellt snyggt utan jag har utvecklat mer realistiska terräng-material såsom berg och gräs, Sådana material ligger som en yta på terrängen och kallas texturer

Min terräng är helt och hållen ritat med triangle-strip som grund, triangle-list skulle vara enklare men tar mer plats i index-bufferten. Här är strukturen för min terrain-vertex. Den har för tillfället givetivs en vector3 position i värld-matrisen, en textur-koordinat.

Jag tog bort stödet för normaler eftersom terrängen ska vara statisk, ev läsa in normaler från en normalmap.

Arrayen med vertexellement är nödvändig för till ex vertex-deklaration, och när vertexen ska läsas i en ström.

den har också en statisk variabel för sin egen storlek i bytes.


public struct TerrainVertex
{
public Vector3 Position;
public Vector2 TextureCoordinate;
public static readonly VertexElement[] VertexElements =
{
new VertexElement(0,0,VertexElementFormat.Vector3,VertexElementMethod.Default,VertexElementUsage.Position,0),
new VertexElement(0,sizeof(float)* 3,VertexElementFormat.Vector2,VertexElementMethod.Default,VertexElementUsage.TextureCoordinate,0)
};
public static readonly int SizeInBytes = sizeof(float) * (3 + 2 );
}


eftersom terrängen kommar ha mellan 6 till 10 texturer (om jag får bestämma) med olika blendweights så är det inte att föredra att kasta runt massa texturer i parametrar. jag har därför också skapat en enklare textur inehållande terrängen alla material:


//En struktur för ett material med 4 texturer;
public struct TerrainMaterial
{
public Texture2D texture1;
public Texture2D texture2;
public Texture2D texture3;
public Texture2D texture4;
public Texture2D mipMap1;
public float scale;
}

Inga kommentarer: