notJustCode.it
 
\\ Home : Articoli
Approfondimenti su Vertex ed Index Buffer
Di RobyDx (del 27/07/2007 @ 15:52:41, in DirectX9, linkato 1532 volte)

I vertex buffer sono utilizzati come sappiamo per contenere i dati sui vertici di un modello. Questi possono essere inclusi in una mesh o utilizzati separatamente e passati al device. Riuscire a creare da zero un vertexbuffer può risultare fondamentale in moltissime situazioni, specie se si deve creare un oggetto da zero o lo si deve caricare da un formato diverso dal formatoX.

Per creare un vertexbuffer da zero è sufficiente dichiarare e creare un oggetto vertex buffer

Dim vb As New VertexBuffer(GetType(Vertex), numeroVertici, device, 0, formato, Pool.Managed)

Il fattore principale è la dimensione ed il formato. Prendiamo ad esempio il formato di vertice canonico.

Public Structure Vertex
    Public p As Vector3
    Public n As Vector3
    Public tu, tv As Single
End Structure

Public Const Format As VertexFormats = VertexFormats.Position Or VertexFormats.Normal Or VertexFormats.Texture1

Tramite getType si prende il formato della struttura che vogliamo usare, passiamo poi il numero dei vertici, il device, l'uso (0) ed il formato. Infine il pool (managed non richiederà di ricaricare al reset).

Ora il vertexbuffer esiste ma tutti i suoi vertici sono a zero

Dim vertici As Vertex()
vertici = vb.Lock(0, GetType(Vertex), 0, NumberVertices)
For i = 0 To vertici.Length - 1
    setta qui i vertici
Next
vb.Unlock()

Nel ciclo potete impostare i vertici come volete.

Per renderizzare

device.SetStreamSource(0, vb, 0)
device.VertexFormat = Vertex.Format
device.DrawPrimitives(PrimitiveType.TriangleList, 0, numeroV)

L'istruzione drawPrimitives renderizza il vertexbuffer che viene passato al device tramite setStreamsouce. NumeroV è il numero dei vertici da renderizzare. Potete sostituire 0 con il vertice di inizio. Importantissimo è passare il vertexFormat as device. Potete scegliere anche ulteriori stream (utili per alcuni effetti in vertex shader).

I vertexbuffer vengono solitamente usati in coppia con l'index buffer. In pratica nel vertexbuffer ci sono disordinatamente tutti i vertici e nell'indexbuffer viene dato l'ordine con cui devono essere renderizzati. Si tratta in pratica di un array di short che di ad esempio 1,2,3,0,1,3 per indicare l'ordine. Per i modelli formati da triangoli sono ovviamente sempre il numero della facce x 3;

Dim ib As New IndexBuffer(device,numberIndices, 0, Pool.Managed, True)

L'ultima è importante. Se impostata a true dovrete usare short come tipo, altrimenti integer. Questo perchè con gli short che sono a 16 bit si possono creare modelli con 65356 indici. Se però superate questo valore allora dovrete passare agli interi con ulteriore spesa di memoria.

Dim indexArray() As Short
indexArray = indexBuffer.Lock(0, GetType(Short), 0, NumberFaces * 3)
'qui usate l'array indexArray per modificare l'array
indexBuffer.Unlock()

device.SetStreamSource(0, vb, 0)
device.Indices = iB
device.VertexFormat = Vertex.Format
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, NumberVertices, 0, numeroFacce)

In questo modo renderizzate primitive con indici.

Attenzione, non avrete i subset come nelle mesh quindi il vertexbuffer è un blocco unico.

In ultimo potete creare direttamente una mesh

Dim mesh As New Mesh(numeroFacce, numeroVertici, MeshFlags.Managed, formato, device)

Con l'accesso alla memoria potete riempire i vertici e gli indici ed usare la mesh normalmente.

Non credo servano esempi.

Articolo Articolo  Storico Storico Stampa Stampa
I commenti sono disabilitati.
"Ciò che veramente mi interessa è se Dio avesse potuto fare il mondo in una maniera differente, cioè se la necessità di semplicità logica lasci qualche libertà."

Albert Einstein


Cerca per parola chiave
 

Titolo
Articoli (4)
C++ (4)
Direct3D10 (30)
Direct3D11 (20)
DirectX9 (82)
DotNet (10)
English (9)
FanGames (22)
ManagedDX11 (2)
Materiale Utile (4)
News (39)
Shader Library (12)
SharpDX (1)
Software (25)
Tecnologia (19)
Varie (9)

Gli interventi più cliccati

Ultimi commenti:
If you wish to retai...
23/05/2013 @ 13:07:45
Di chanel outlet
You deficit of self-...
23/05/2013 @ 13:07:13
Di cartier watches uk
Reinforce your own l...
23/05/2013 @ 13:06:37
Di replica watches
Whenever you"re shiv...
23/05/2013 @ 13:06:11
Di swiss replica watches
It's likely you have...
23/05/2013 @ 13:05:02
Di chanel handbags
Cheap automobile ins...
23/05/2013 @ 13:04:28
Di replica watches

Titolo
Con quale tecnologia state realizzando o avete intenzione di realizzare i vostri progetti?

 DirectX11
 DirectX10
 DirectX9
 XNA
 DirectX8 o Precedenti
 OpenGL
 Motori grafici già pronti
 Altro

Titolo
Umorismo (17)

Le fotografie più cliccate



Ci sono 743 persone collegate
Sono state visualizzate  pagine

22/11/2024 @ 15:45:23
script eseguito in 31 ms