Orario: 18-05-2013, 18:17 Benvenuto ospite! (Log inRegistrati)


Rispondi 
[DirectX9] Official Topic
Autore Messaggio
Tano
Ninja Scientist

Messaggi: 1,408
Registrato: Nov 2008
Offline Offline
#1 [DirectX9] Official Topic
0
Allora.. Siccome stavo studiando le directx9 da 0 per avere una conoscenza un pò più profonda del 3D Programming, avevo pensato di raccogliere tutte le informazioni, domande e dubbi qui. In modo che tutti possiamo imparare qualcosa..

Ora, mi sono divorato un pò di libri sulle DX9. Ma non ho ancora ben compreso la vera differenza tra il VertexBuffer e l'IndexBuffer.. Cioè. Perchè usare uno e non l'altro? Quali reali vantaggi porta fare la scelta giusta?

Magari la mia domanda è stupida, ma volevo sentire i vostri pareri.

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
24-04-2010 13:34
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Xaldyz
Esoterico

Messaggi: 2,385
Registrato: Apr 2010
Offline Offline
#2 RE: [DirectX9] Official Topic
0
Stando a quanto ho letto da Riemers (PS: esempi di XNA) (e molto probabilmente sto dicendo una boiata Asd ) gli indici servono per "risparmiare" sui triangoli da inviare alla CPU, in maniera tale da minimizzare lo spreco del passaggio di dati.
Quindi, potresti usare il VertexBuffer senza IndexBuffer e tutto filerebbe liscio (nel senso che funziona, ma liscio penso proprio di no Rotfl )
24-04-2010 13:43
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 5,867
Registrato: Nov 2008
Offline Offline
#3 RE: [DirectX9] Official Topic
0
Scelta? Asd

Guarda che li devi usare entrambi: a grandi linee il vertex buffer è il vettore dei punti, e l'index buffer è il vettore delle facce.
Va da se che un modello composto di soli punti senza alcuna faccia è piuttosto inutile Ahsisi

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
24-04-2010 13:45
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 6,978
Registrato: Nov 2008
Online Online
#4 RE: [DirectX9] Official Topic
0
Bel topic, ho un problema nella realizzazione della swap chain (inizio progetto)
in pratica credo che non abbia inserito l'header giusto per usare le directx (o meglio non ho inserito niente, sto seguendo un libro e al momento ho creato solo una finestra)

Nel libro non c'è scritto niente,

sulla documentazione msnd c'è scritto di usare DXGI.h ma non risolve il problema

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
24-04-2010 13:48
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,252
Registrato: Sep 2004
Offline Offline
#5 RE: [DirectX9] Official Topic
0
heyla Tano! Sorriso finalmente possiamo parlarne qui e non solo su msn Asd almeno resta un "log" di tutta la roba che diciamo sulle dx...

Allora, ti spiego velocissimamente a cosa serve un index buffer.

Un Index Buffer (IB da ora) è un "array" di int, sono indici, numeri interi. Questi indici non sono nient'altro che le posizioni nel vertex buffer dei vertici che la gpu deve leggere per renderizzare la geometria, il vantaggio nell'uso di una "indexed mesh" è che oltre al vertex buffer avendo anche un index buffer si risparmia memoria sui vertici, evitando duplicati.

Prendiamo il caso di un cubo, usando soltanto un vertex buffer avremo:

Codice:
//faccia superiore (due poligoni)
v1
v2
v3

v3
v4
v1

//faccia inferiore
v5
v6
v7

v7
v8
v5

...
e così via anche per le facce laterali, in totale avremo 12 poligoni composti da 8 vertici, questi 8 vertici però saranno tutti duplicati tra loro, perciò in realtà i vertici saranno 36 (questo anche nel caso in cui non ci siano uv o altri dati a complicare il conteggio dei vertici)

usando invece un vertex buffer e un index buffer avremo:

Codice:
//vertex buffer
v1
v2
v3
v4
v5
v6
v7
v8

//index buffer
//faccia superiore (due poligoni)
1
2
3
3
4
1

e così via...

In questo modo i vertici in memoria sono solo 8, e la gpu sa come "costruire" la geometria usando l'index buffer come lookup, in pratica guardando il valore dell'indice sa ogni volta quale vertice tra gli 8 in lista deve usare per costruire il poligono.

Di conseguenza un index buffer è SEMPRE di grandezza "poligoni_modello*3" mentre un vertex buffer può varirare tra il numero di vertici reali del modello e "poligoni_modello*3"

Spero di essermi spiegato abbastanza bene...

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
(Questo messaggio è stato modificato l'ultima volta il: 24-04-2010 14:00 da Eclipse.)
24-04-2010 13:56
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Xaldyz
Esoterico

Messaggi: 2,385
Registrato: Apr 2010
Offline Offline
#6 RE: [DirectX9] Official Topic
0
(24-04-2010 13:56)Eclipse ha scritto:  
Codice:
//vertex buffer
v1
v2
v3
v4
v5
v6
v7
v8

//index buffer
//faccia superiore (due poligoni)
1
2
3
3
4
1

Così facendo però abbiamo 8 vertici e 36 indici se non sbaglio giusto? Il vantaggio consiste che un indice occupa meno memoria rispetto a un vertice?
(Questo messaggio è stato modificato l'ultima volta il: 24-04-2010 14:01 da Xaldyz.)
24-04-2010 14:00
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,252
Registrato: Sep 2004
Offline Offline
#7 RE: [DirectX9] Official Topic
0
si, un indice è un semplice int, mentre un vertice è una struttura molto complessa che può somigliare a qualcosa del genere:

Codice:
struct vertex
{
   Vector3 pos;
   Vector3 normal;
   Vector2 uv;
}
o addirittura essere ancora molto più grande per modelli normalmappati (dove possono esserci altri Vector3 per binormal e tangent) o per le mesh animate, dove ogni vertice ha anche dei "pesi" per lo scheletro, oppure se il modello ha più di un canale per le uv (ad es una lightmap o texture multiple)

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
(Questo messaggio è stato modificato l'ultima volta il: 24-04-2010 14:06 da Eclipse.)
24-04-2010 14:05
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
fzambetta
Senior Lecturer

Messaggi: 1,743
Registrato: Dec 2009
Offline Offline
#8 RE: [DirectX9] Official Topic
0
(24-04-2010 13:45)_ToMmO_ ha scritto:  Scelta? Asd

Guarda che li devi usare entrambi: a grandi linee il vertex buffer è il vettore dei punti, e l'index buffer è il vettore delle facce.
Va da se che un modello composto di soli punti senza alcuna faccia è piuttosto inutile Ahsisi

No, mi sa che qui ti sbagli (o mi ricordo male io?) Asd
DirectX 9 non supporta sia l'interfaccia DrawIndexedPrimitive che la DrawPrimitive?
Quest'ultima non usa indici e suppone che i vertici passati siano composti da triple se usi la triangle list (ragionamento analogo per primitive diverse).
Ovviamente in termini di perfomance ha decisamente senso usare la versione indicizzata.

Fabio Zambetta
Senior Lecturer, School of CS&IT
RMIT University (Melbourne, AU)

Games & Graphics Programming degree Coordinator

My Kinect hand gestures debugger
24-04-2010 14:23
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,252
Registrato: Sep 2004
Offline Offline
#9 RE: [DirectX9] Official Topic
0
Penso Tommo si riferisse al dubbio di tano nell'usare vb O ib, un vertex buffer bisogna usarlo comunque.

Come dice Fabio Direct3D 9 ha DrawIndexedPrimitive, DrawPrimitive e DrawPrimitiveUp.

La prima è per usare vertex+index buffer, la seconda per un vertex buffer già ordinato e la terza serve invece solo per debugging, permette di creare un vertex buffer on-the-fly passando una struttura custom (ad esempio un normale array di Vector3) e ovviamente non è da usare normalmente

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
24-04-2010 14:40
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 5,867
Registrato: Nov 2008
Offline Offline
#10 RE: [DirectX9] Official Topic
0
Si, intendevo che in genere per qualsiasi cosa più complessa di una teiera è necessario usare gli indici se non si vuole avere poly*3 vertici in memoria...
per cui imho in pratica la scelta non c'è Ahsisi

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
24-04-2010 14:51
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
encelo
Main(die)stream

Messaggi: 3,251
Registrato: Nov 2008
Offline Offline
#11 RE: [DirectX9] Official Topic
0
(24-04-2010 13:34)Tano ha scritto:  Ora, mi sono divorato un pò di libri sulle DX9. Ma non ho ancora ben compreso la vera differenza tra il VertexBuffer e l'IndexBuffer.. Cioè. Perchè usare uno e non l'altro? Quali reali vantaggi porta fare la scelta giusta?
Ma che libri hai letto? Asd
L'esempio di eclipse con i vertici del cubo che non si ripetono è citato ovunque, e ti parlo da sviluppatore OpenGL per le quali, ovviamente, si applicano questi stessi concetti.

Angelo "Encelo" Theodorou
.: Blog | Twitter | LinkedIn | Ohloh | Last.FM | Vimeo | Steam :.
All problems in computer graphics can be solved with a matrix inversion. - James Blinn
24-04-2010 16:18
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,252
Registrato: Sep 2004
Offline Offline
#12 RE: [DirectX9] Official Topic
0
a saperlo invece di scriverlo linkavo un libro allora Asd
Io ho imparato quasi tutto dall'sdk e ovviamente da MSDN

Comunque consiglio Introduction to 3D Game Programming with DirectX 9.0c: A Shader Approach
qui tra l'altro trovate i sorgenti degli esempi del libro
http://www.d3dcoder.net/d3d9c.aspx#

è facilmente reperibile in "formato digitale", se no potete trovarlo su amazon

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
(Questo messaggio è stato modificato l'ultima volta il: 24-04-2010 20:16 da Eclipse.)
24-04-2010 20:12
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
fzambetta
Senior Lecturer

Messaggi: 1,743
Registrato: Dec 2009
Offline Offline
#13 RE: [DirectX9] Official Topic
0
Io invece volevo solo ricordare che in materia di shaders & DirectX 9 (Tano, immagino che a breve ci darai un'occhiata) sono stati rilasciati due libri della Wordware Publishing Smile
Si trovano gratuitamente su GDNet: http://www.gamedev.net/community/forums/..._id=500691

Fabio Zambetta
Senior Lecturer, School of CS&IT
RMIT University (Melbourne, AU)

Games & Graphics Programming degree Coordinator

My Kinect hand gestures debugger
25-04-2010 6:03
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tano
Ninja Scientist

Messaggi: 1,408
Registrato: Nov 2008
Offline Offline
#14 RE: [DirectX9] Official Topic
0
(24-04-2010 16:18)encelo ha scritto:  
(24-04-2010 13:34)Tano ha scritto:  Ora, mi sono divorato un pò di libri sulle DX9. Ma non ho ancora ben compreso la vera differenza tra il VertexBuffer e l'IndexBuffer.. Cioè. Perchè usare uno e non l'altro? Quali reali vantaggi porta fare la scelta giusta?
Ma che libri hai letto? Asd
L'esempio di eclipse con i vertici del cubo che non si ripetono è citato ovunque, e ti parlo da sviluppatore OpenGL per le quali, ovviamente, si applicano questi stessi concetti.

Aspetta. Il mio dubbio nasce nel voler comprendere la differenza tra i due. Nei libri di DX9 che ho letto, viene si citato come creare il cubo con le facce, ma molte volte è fatto fillando solo i vertici nel vertexbuffer..

Purtroppo (ma mica tanto Sorriso) mi sono sempre di più concentrato sull'architettura software dei Giochi e Gameplay e non sulla programmazione grafica, quindi alcuni argomenti, in particolare il vertex buffer, sono per me nuovi.

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
25-04-2010 12:06
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
fzambetta
Senior Lecturer

Messaggi: 1,743
Registrato: Dec 2009
Offline Offline
#15 RE: [DirectX9] Official Topic
0
(25-04-2010 12:06)Tano ha scritto:  Aspetta. Il mio dubbio nasce nel voler comprendere la differenza tra i due. Nei libri di DX9 che ho letto, viene si citato come creare il cubo con le facce, ma molte volte è fatto fillando solo i vertici nel vertexbuffer..

Si, quindi stavano usando la DrawPrimitive come dicevo piu' su invece della DrawIndexedPrimitive, la qual cosa tuttavia (come faceva notare Tommo) e' un suicidio in termini di performance e di occupazione di memoria in qualunque caso non banale.

Fabio Zambetta
Senior Lecturer, School of CS&IT
RMIT University (Melbourne, AU)

Games & Graphics Programming degree Coordinator

My Kinect hand gestures debugger
25-04-2010 13:45
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: