venerdì 26 dicembre 2014

Disegnare triangoli in Direct3D senza VertexBuffer

Disegno triangoli soltanto definendo un array di vertici.
Questo è il codice che definisce i vertici.
public void CreaVertici()
        {
            vertices = new CustomVertex.PositionColored[9];
            vertices[0].Position = new Vector3(0f, 0f, 0f);
            vertices[0].Color = Color.Blue.ToArgb();
            vertices[1].Position = new Vector3(0f, 10f, 0f);
            vertices[1].Color = Color.Blue.ToArgb();
            vertices[2].Position = new Vector3(10f, 0f, 0f);
            vertices[2].Color = Color.Blue.ToArgb();
            vertices[3].Position = new Vector3(5f, 0f, 0f);
            vertices[3].Color = Color.Green.ToArgb();
            vertices[4].Position = new Vector3(5f, 15f, 0f);
            vertices[4].Color = Color.Green.ToArgb();
            vertices[5].Position = new Vector3(15f, 0f, 0f);
            vertices[5].Color = Color.Green.ToArgb();
            vertices[6].Position = new Vector3(0f, -10f, 0f);
            vertices[6].Color = Color.Red.ToArgb();
            vertices[7].Position = new Vector3(18f, -15f, 0f);
            vertices[7].Color = Color.Red.ToArgb();
            vertices[8].Position = new Vector3(15f, 8f, 0f);
            vertices[8].Color = Color.Red.ToArgb();
        }
Il numero evidenziato in rosso su giallo è il numero di vertici compresi nell'array,

Se non si usa vertexBuffer bisogna specificare i vertici uno dopo l'altro anche se sono uguali.
Una volta specificati i vertici, di tipo CustomVertex.PositionColored, si usa il comando che li stampa:
        private void render()
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 3, vertices);
            device.EndScene();
            device.Present();
        }
Ecco, quello marcato in rosso è il comando fondamentale, che stampa i triangoli specificando:
  • Il tipo di primitiva
  • Il numero di primitive
  • l'array di vertici da usare.
Il numero di primitive è importante! Se non si specifica il numero giusto non vengono disegnate tutte le primitive.
Ecco l'immagine:



Ma se io uso device.DrawUserPrimitives specificando un numero inferiore di primitive:
        private void render()
        {
            device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 2, vertices);
            device.EndScene();
            device.Present();
        }
Ottengo questa immagine:

Nessun commento:

Posta un commento