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