Ora cerchiamo di disegnare un quadrato fatto di due triangoli.
Pagina di riferimento per il costruttore di VertexBuffer
Ecco il codice:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load NumeroVertici = 4 NumeroIndici = 4 InitializeGraphics() VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default) Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {} vertici(0).Position = New Vector3(0, 0, 0) vertici(0).Color = Color.Blue.ToArgb vertici(1).Position = New Vector3(5, 0, 0) vertici(1).Color = Color.Red.ToArgb vertici(2).Position = New Vector3(5, 5, 0) vertici(2).Color = Color.Yellow.ToArgb vertici(3).Position = New Vector3(0, 5, 0) vertici(3).Color = Color.Green.ToArgb VBuffer.SetData(vertici, 0, LockFlags.None) ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default) Dim indici As Integer() = New Integer(NumeroIndici) {} indici(0) = 1 indici(1) = 2 indici(2) = 0 indici(3) = 3 'indici(4) = 2 'indici(5) = 0 ib.SetData(indici, 0, LockFlags.None) ...Prima si costruisce il VertexBuffer:
VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default) Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {} vertici(0).Position = New Vector3(0, 0, 0) vertici(0).Color = Color.Blue.ToArgb vertici(1).Position = New Vector3(5, 0, 0) vertici(1).Color = Color.Red.ToArgb vertici(2).Position = New Vector3(5, 5, 0) vertici(2).Color = Color.Yellow.ToArgb vertici(3).Position = New Vector3(0, 5, 0) vertici(3).Color = Color.Green.ToArgb VBuffer.SetData(vertici, 0, LockFlags.None)Quindi l'IndexBuffer:
ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default) Dim indici As Integer() = New Integer(NumeroIndici) {} indici(0) = 1 indici(1) = 2 indici(2) = 0 indici(3) = 3 ib.SetData(indici, 0, LockFlags.None)Ecco il codice che "stampa":
dispositivo.RenderState.Lighting = False dispositivo.RenderState.CullMode = Cull.None dispositivo.RenderState.FillMode = FillMode.WireFrame dispositivo.Clear(ClearFlags.Target, Color.Black, 1, 0) dispositivo.BeginScene() dispositivo.VertexFormat = CustomVertex.PositionColored.Format dispositivo.SetStreamSource(0, VBuffer, 0) dispositivo.Indices = ib dispositivo.DrawIndexedPrimitives(PrimitiveType.TriangleStrip, 0, 0, 4, 0, 2) dispositivo.EndScene() dispositivo.Present()
Che cosa ottengo con tutto questo?
Ho problemi con l'ordine dei vertici.
Cerchiamo innanzitutto di stabilire il punto di vista mediante la View Matrix:
dispositivo.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, 15), New Vector3(0, 0, 0), New Vector3(0, 1, 0))Ecco: creo due triangoli in una TriangleStrip.
Creo il VertexBuffer:
VBuffer = New VertexBuffer(GetType(CustomVertex.PositionColored), NumeroVertici, dispositivo, 0, CustomVertex.PositionColored.Format, Pool.Default) Dim vertici As CustomVertex.PositionColored() = New CustomVertex.PositionColored(NumeroVertici) {} vertici(0).Position = New Vector3(0, 0, 0) vertici(0).Color = Color.Blue.ToArgb vertici(1).Position = New Vector3(5, 0, 0) vertici(1).Color = Color.Yellow.ToArgb vertici(2).Position = New Vector3(5, 5, 0) vertici(2).Color = Color.Red.ToArgb vertici(3).Position = New Vector3(0, 5, 0) vertici(3).Color = Color.Green.ToArgb
Creo l'IndexBuffer:
ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default) Dim indici As Integer() = New Integer(NumeroIndici) {} indici(0) = 0 indici(1) = 1 indici(2) = 2 indici(3) = 3 ib.SetData(indici, 0, LockFlags.None)Ecco il risultato:
Qui il triangolo è stato tracciato nell'ordine dei vertici rosso, giallo e blu. L'ultimo ad essere stato tracciato è il cateto verticale, e il nuovo triangolo è stato tracciato avendo in comune con esso questo cateto.
Adesso tracciamo per ultimo il cateto orizzontale:
ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default) Dim indici As Integer() = New Integer(NumeroIndici) {} indici(0) = 2 indici(1) = 0 indici(2) = 1 indici(3) = 3
E ora tracciamo per ultima l'ipotenusa:
ib = New IndexBuffer(GetType(Integer), NumeroIndici, dispositivo, 0, Pool.Default) Dim indici As Integer() = New Integer(NumeroIndici) {} indici(0) = 1 indici(1) = 2 indici(2) = 0 indici(3) = 3
Nessun commento:
Posta un commento