|
|
Pagina 5 din 5
[
1
|
2
|
3
|
4
|
5
]
| Mesaj |
Info autor |
Postat la 17 Oct 2009 21:40:36 Subiect: Re:
|
|
|
Deliverance info:
|
Deliverance:
pin46_2 a scris: Ar fi interesant dacă ai publica o listă cu working features așa cum au Irrlicht/Ogre edit, în blogu de 10 oct vorbești de point sprites. Ce înțelegi tu prin asta billboards? Pt că ce arăți tu în filme îs sisteme de particule(care pot sau nu să fie făcute din billboards). edit2 prin billboard înțeleg figură geometrică pt care se fac doar transformări de poziție nu și de rotație (adică îs cu fața la cameră tot timpul) BillBoarding se poate implementa in mai multe moduri dar de obicei se face o rotatzie si translatzie. Rotatzia se face in asa fel incat ca poligonul respectiv sa priveasca spre camera. Exista mai multe posiblitatzi si aici. Una eleganta si nu neaparat eficienta este sa te folosesti de matricea de transformare din world space in camera space. Billboard-ul se afla in World Space si vrei sa il transformi in camera space. Din cate inteleg eu e de ajuns sa inlocuiesti pozitia camerei cu pozitia billboardului, sa inversezi matricea de transformare a camerei si sa negi axa Z. Pare corect, desi n-am incercat pana acum varianta asta  .
|
Status:
Înregistrat pe: 13 Oct 2006 10:05:37
Vârsta: 24 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator
|
| |
Postat la 17 Oct 2009 22:27:09 Subiect: < fara subiect >
|
|
|
Dark info:
|
Dark:
Deliverance a scris: BillBoarding se poate implementa in mai multe moduri dar de obicei se face o rotatzie si translatzie. In vertex buffer, pui toti cei 4 vertecsi in centrul billboard-ului (in object space, evident). In z-ul si w-ul coordonatelor de texturi (sau in alte doua componente, daca ai gauri prin alte locuri) tii vectorul de la centrul billboard-ului pina la vertex-ul respectiv. De exemplu, pentru un billboard cu latura 1, centrat in origine, vertex buffer-ul e ceva de genul: Cod sursă:
P0: (0.0, 0.0, 0.0)
T0: (0.0, 0.0, -0.5, -0.5)
P1: (0.0, 0.0, 0.0)
T1: (1.0, 0.0, 0.5, -0.5)
P2: (0.0, 0.0, 0.0)
T2: (1.0, 1.0, 0.5, 0.5)
P3: (0.0, 0.0, 0.0)
T3: (0.0, 1.0, -0.5, 0.5)
Daca billboard-ul acopera toata textura, sau exista o alta forma de corelatie intre UV-uri si pozitiile vertecsilor, nu mai tii deloc vectorii aia, ci-i calculezi in vertex shader din UV-uri. De exemplu: Cod sursă:
// Presupunem ca "vert" e structura care vine ca input pentru VS.
#if BILLBOARD_COVERS_TEXTURE
float2 displ = vert.texCoord.xy*billboardSize - float2(0.5, 0.5)*billboardSize;
#else
float2 displ = vert.texCoord.zw;
#endif
Dupa aia, iti pasezi spre vertex shader right vector-ul si up vector-ul camerei (adica prima si a doua coloana din world-view matrix, daca ai column vectors, sau prima si a doua linie din matricea respectiva, daca esti pe invers si lucrezi cu row vectors). Vertex shader-ul se foloseste de vectorii aia doi si de informatiile din "displ" pentru a ajusta pozitia fiecarui vertex: Cod sursă:
float3 g_camRightVector : register(c6);
float3 g_camUpVector : register(c7);
/* ... */
float3 pos = vert.pos.xyz;
pos.xyz += displ.x * g_camRightVector.xyz;
pos.xyz += displ.y * g_camUpVector.xyz;
// Dupa asta vine inmultirea cu world-view-projection.
Simplu si eficient. Daca stai un pic cu o foaie si un pix, iti dai seama ca aia doi vectori sint de fapt axele planului de proiectie al camerei (sau ale geamului in care randezi, mai pe romaneste) in spatiul obiectului, iar shader-ul calculeaza unde trebuie sa fie vertecsii in object space ca billboard-ul sa ajunga paralel cu planul de proiectie. In felul asta n-ai nevoie de o transformare mai costisitoare, sau de o matrice per billboard, sau mai stiu eu ce. Daca esti in DX10, trimiti un singur vertex la vertex shader pentru fiecare billboard, dupa care generezi din el cele 4 colturi ale billboard-ului, in geometry shader. In felul asta scutesti niste RAM si niste vertex throughput, dar GS-ul ala nu e moca, deci probabil per total nu cistigi mai nimic. Scuze de off-topic.
Ultima editare efectuată de Dark pe 17 Oct 2009 22:28:57; 1 editări în total
"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D. Autobaza
|
Status:
Înregistrat pe: 12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 729
Locatie:
Programator
|
| |
Postat la 17 Oct 2009 23:42:17 Subiect: < fara subiect >
|
|
|
pin46_2 info:
[banned]
|
pin46_2:
BillBoarding se poate implementa in mai multe moduri dar de obicei se face o rotatzie si translatzie Mă pregăteam să spun că depinde de ordinea matrițelor în stivă însă dacă ai la camera rotire automat ai matriță de rotire la billboards. Mă tot încurc pentru că matrițele de rotire și translație se salvează într-o matriță de transformări spațiale (GL_ModelView) iar setările de perspectivă în matrița de proiecție (GL_Perspective).
Ultima editare efectuată de pin46_2 pe 18 Oct 2009 00:55:24; 1 editări în total
numele care trezește emoții
|
Status:
Înregistrat pe: 15 Oct 2009 00:25:58
Vârsta: ? ani
Mesaje: 10
Locatie:
|
| |
Postat la 17 Oct 2009 23:42:25 Subiect: Re:
|
|
|
Deliverance info:
|
Deliverance:
Dark a scris: Deliverance a scris: BillBoarding se poate implementa in mai multe moduri dar de obicei se face o rotatzie si translatzie. In vertex buffer, pui toti cei 4 vertecsi in centrul billboard-ului (in object space, evident). In z-ul si w-ul coordonatelor de texturi (sau in alte doua componente, daca ai gauri prin alte locuri) tii vectorul de la centrul billboard-ului pina la vertex-ul respectiv. De exemplu, pentru un billboard cu latura 1, centrat in origine, vertex buffer-ul e ceva de genul: Cod sursă:
P0: (0.0, 0.0, 0.0)
T0: (0.0, 0.0, -0.5, -0.5)
P1: (0.0, 0.0, 0.0)
T1: (1.0, 0.0, 0.5, -0.5)
P2: (0.0, 0.0, 0.0)
T2: (1.0, 1.0, 0.5, 0.5)
P3: (0.0, 0.0, 0.0)
T3: (0.0, 1.0, -0.5, 0.5)
Daca billboard-ul acopera toata textura, sau exista o alta forma de corelatie intre UV-uri si pozitiile vertecsilor, nu mai tii deloc vectorii aia, ci-i calculezi in vertex shader din UV-uri. De exemplu: Cod sursă:
// Presupunem ca "vert" e structura care vine ca input pentru VS.
#if BILLBOARD_COVERS_TEXTURE
float2 displ = vert.texCoord.xy*billboardSize - float2(0.5, 0.5)*billboardSize;
#else
float2 displ = vert.texCoord.zw;
#endif
Dupa aia, iti pasezi spre vertex shader right vector-ul si up vector-ul camerei (adica prima si a doua coloana din world-view matrix, daca ai column vectors, sau prima si a doua linie din matricea respectiva, daca esti pe invers si lucrezi cu row vectors). Vertex shader-ul se foloseste de vectorii aia doi si de informatiile din "displ" pentru a ajusta pozitia fiecarui vertex: Cod sursă:
float3 g_camRightVector : register(c6);
float3 g_camUpVector : register(c7);
/* ... */
float3 pos = vert.pos.xyz;
pos.xyz += displ.x * g_camRightVector.xyz;
pos.xyz += displ.y * g_camUpVector.xyz;
// Dupa asta vine inmultirea cu world-view-projection.
Simplu si eficient. Daca stai un pic cu o foaie si un pix, iti dai seama ca aia doi vectori sint de fapt axele planului de proiectie al camerei (sau ale geamului in care randezi, mai pe romaneste) in spatiul obiectului, iar shader-ul calculeaza unde trebuie sa fie vertecsii in object space ca billboard-ul sa ajunga paralel cu planul de proiectie. In felul asta n-ai nevoie de o transformare mai costisitoare, sau de o matrice per billboard, sau mai stiu eu ce. Daca esti in DX10, trimiti un singur vertex la vertex shader pentru fiecare billboard, dupa care generezi din el cele 4 colturi ale billboard-ului, in geometry shader. In felul asta scutesti niste RAM si niste vertex throughput, dar GS-ul ala nu e moca, deci probabil per total nu cistigi mai nimic. Scuze de off-topic. Haha.. Tare! Oricum ar fi e tot rotatzie si translatzie, fara ele nu vad cum ai putea.
Ultima editare efectuată de Deliverance pe 17 Oct 2009 23:44:14; 2 editări în total
|
Status:
Înregistrat pe: 13 Oct 2006 10:05:37
Vârsta: 24 ani
Mesaje: 253
Locatie: Iasi , Romania
Programator
|
| |
Postat la 18 Oct 2009 11:23:19 Subiect: Re: Re:
|
|
|
Dark info:
|
Dark:
Deliverance a scris: Oricum ar fi e tot rotatzie si translatzie, fara ele nu vad cum ai putea. Da, vertecsii sint rotiti in jurul centrului billboard-ului, dar nu trebuie sa calculezi explicit unghiuri sau matrici, totul se intimpla in alea doua MAD-uri cu vectorii camerei. Daca ai un vertex buffer cu multe billboard-uri (de exemplu frunzele unui copac), tehnica asta iti permite sa le faci paralele cu camera cu doar 2 instructiuni in vertex shader, si practic fara cost aditional in CPU (foarte probabil ai deja matricea model-view pentru alte lucruri, iar daca nu o ai e doar o inmultire de matrici o singura data pentru tot copacul, nu faci o operatiune per billboard). Daca nu faci orientarea din vertex shader, trebuie sa folosesti un vertex buffer dinamic, in care rotesti billboard-urile din CPU, ceea ce e groaznic ca performanta. Totusi, thread-ul era despre engine-ul lui nekitu; pentru discutia asta (sau pentru aberatii despre stive de matrite) ar trebui facut un thread nou.
"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D. Autobaza
|
Status:
Înregistrat pe: 12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 729
Locatie:
Programator
|
| |
Postat la 18 Oct 2009 12:29:07 Subiect: Re:
|
|
|
Pintea info:
|
Pintea:
Dark a scris: Daca esti in DX10, trimiti un singur vertex la vertex shader pentru fiecare billboard, dupa care generezi din el cele 4 colturi ale billboard-ului, in geometry shader. In felul asta scutesti niste RAM si niste vertex throughput, dar GS-ul ala nu e moca, deci probabil per total nu cistigi mai nimic. Merge ceva de genul asta si in DX9 folosind hardware instancing. Ai un singur vertex pentru fiecare billboard pe stream 1, iar pe stream 0 repeti 4 vertecsi ce contin doar coordonatele de textura ca sa stii ce corner e. Desigur, se apeleaza VS-ul de 4 ori, dar castigi ceva memorie.
|
Status:
Înregistrat pe: 05 May 2007 14:50:45
Vârsta: 28 ani
Mesaje: 300
Locatie:
Programator
|
| |
Postat la 18 Oct 2009 13:02:52 Subiect: < fara subiect >
|
|
|
Dark info:
|
Dark:
Ai dreptate, nu ma gindisem la hardware instancing.
"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D. Autobaza
|
Status:
Înregistrat pe: 12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 729
Locatie:
Programator
|
| |
Postat la 18 Oct 2009 22:46:19 Subiect: < fara subiect >
|
|
|
pin46_2 info:
[banned]
|
pin46_2:
[pin46_2 a observat remarca lui Dark din paranteză dar se face că nu o observă pentru a evita un flame war] http://www.gamedev.ro/forum/14
Ultima editare efectuată de pin46_2 pe 18 Oct 2009 23:02:46; 2 editări în total
numele care trezește emoții
|
Status:
Înregistrat pe: 15 Oct 2009 00:25:58
Vârsta: ? ani
Mesaje: 10
Locatie:
|
| |
Pagina 5 din 5
[
1
|
2
|
3
|
4
|
5
]
|
|
|