Skocz do zawartości

[Delphi][OpenGL]Octree + Tablice wyświetlania.


5corpio

Polecane posty

Robię Octree albo staram się zrobić i jednak wynika mi pewien problem otóż. Dzielę wysłaną geometrie zależnie od pozycji środka jej. Jednak po podzieleniu na 8 częsci już nie używam indeksów ponieważ coś nie wychodzi i korzystam [b]na razie z glDrawArrays() i co się okazuje efekt tego jest gorzszy w FPS-ach niż użycie glVertex3f(). Czyli gdy rysuje każdy z 8 węzłów drzewa przez glDrawArrays() uzyskuje mniej FPS-ów niż rysując całe to drzewo używając tablicy z indeksami przez glVertex3f(). Żeby się upewnić wyłączyłem textury, światło i ustawiłem tak samo kamerę. Oto jak dzielę geometrie : (wierzchołki chyba są oki wpisywane ale coś z indeksami jest nie tak ponieważ używając glDrawElements() nic kompletnie się nie pokazuje a glDrawArrays() działa pięknie):

[code=Delphi]
Procedure TOctree.CreateNode(vertexList : array of TVertex[UÓZ[[^^HÓ]Bf6TĆ7B'&bDf6SVf61ą ą4)4(14)4(4(//Jesli ma byc lisciem to cala geo. pakujemy do tego wezla
YXY[BY[BWÓXYHYNBWVG2ŁVfW'G3Vf6W2ŁVf6W3}MM4(4(Ńź}AŃź4( m_vertices[i] := vertexList[i];

for i := 0 tW[QXBWXWHHXSWNBB[@V6P&Vvf\"ŁFź4(4(}9mtąąem(SizeOf(TOctree));

m_subNodes[i]^ := TOctYKX]NBBWXWWW[T[H N7V$ćFW5śćVf6W2ŁMŃ1ŃĄ}9mux}Ń
}9mux}Points);
SetLength(m_subNodes[i]^.m_faces, m_XWWW[QXĘNB[BBB\"ŁFVf6W2F&VvźMAI]i9%
idQI=)-Pi9U)M%=I9e41]e4AIiNIM PRZEDZIALE
//Wspolrzedne pierwszego wierzHXYH][YCBY

^śf6TĆ7EśćdćFWłćefCł&$6VFW\"ćećBfW'FWĆ7m1Ńmt%lutd
Ńd4( and (vertexList[faceList[i].fIndex[0]].fZ >= bbCenter.fJHB][YH^YXFWfW'FWĆ7Eśf6TĆ7EśćdćFWłćeą
Ń`ĄŃ1Ńm1Ńmt%lutd>= bbCenter.fY)
and (vertexList[faceListWK[^WWK H[JHBH7FFćvW'Ś6ĆVrG&Śś6R&vćW7&vGŚĄŃ1Ńm1Ńmt%lut`ą
ŃX) and (vertexList[faceList[i].fIndex[2]].fY >= bbCenter.JCB[
^XSWK[^WKfwCł&$6VFW\"ćeFV&Vvź$źĄą4( m_subNodes[0]^.m_vertices[m_subNodes[0]^.m_numP[HWHH^XSWK[^WNB\0w6ćRćFV7RvW'Ś66śŚ7V$ćFW5łćm}9lux}t%lt}9l]^.m_numPoints - 1;

inc(m_subNodes[0]W[T[ĘNB][
WXWćfW'F6W27V$ćFW5łćVG2źź4(}9lux}Ńces[m_subNodes[0]^.m_numPoints - 1] := vertexList[faceList[iK[^WWNB[ ZBWXWf6W5ś7V$ćFW5łćVf6W2ćdćFWłŁ7V$ćF
Wlux}AŃ4(4(Ą}9l]^.m_numPoints);
SetLength(m_subNodes[0WWXWXWW[T[ĘNBB6śvćRG'ŚV6VvvW'Ś6Ćś}9lux}Ńm}9lux}AŃ := vertexList[faceList[i].fIndex[2]];
//Indeks BWXWWXWXWW[QXHćdćFWł% Ł7V$ćFW5łćVG2Ą}9lux}AŃ4(
SetLength(m_subNodes[0]^.m_vertices, m_subNodes[0]^. m_num[ĘNBBBYZ[YH[HFpć27V$ć
FW5łćVf6W2MŃ1ŃĄ}9lux}}9[0]^.m_numFaces);

end;

//POTEM KAHQTÓÓUHQHRSSRSSRRETt% TrbR7V$ćFW5F}џѹ}ŃŃźabl
ica z wierzchołkami.
//
[/code]

Co jest nie tak z tymi indeksami, że onie nie działają ? ktoś wie ? próbowałem już to zmieniać i nic :/[/syntax]

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Witam!

Kod który zapodałeś jest okropny i nawet nie będę próbował go zrozumieć smile.gif.
Na wstępie zanim zaczniesz dzielić zbuduj jedną tablicę geometrii i przerzuć tam wszystkie poligony z siatki do podziału bo kod który dałeś u mnie wygląda tak:


[code=Delphi] function TMainNode.Node_QuantityObjects: Integer;
var
i,[YB[YNX[BSPX^Z[[NBYŚ[fĆ&GŚ2ćRĆv7rŚś77&vGŚćPbFW\& quot;ćVFVWC7Ńąą4(Aą4(4(źQstk
ich poligonów
for i := 0 to mother.numPoly - 1 do
bY[BB[YHH[NBBY[Ń^
JHV&Vv2ŁFW\"&6ŚR`Ą5555a}MQ%
-}9=
(MMC.vMin.y >= pos.y - size.y * MAX_STICK_NODE)[B
SPZ[ HH^K
PVPÓDRć@2dfCł26ŚR5D4}9=4(Ą555ąŹ5a}MICK_NODE) and
(MMC.vMax.z <= pos.z + size.z * MAPÓŃJH[BY[BÓ[JJNBVćCVćCVćCw&6ĆnbĆv7rVś7ŚVćRFW7GP&W7VBŁVŚVćC [/code]


Nie zwracaj uwagi na size.x * MAX_STICK_NODE bo to tylko dodatkowa optymalizacja z mojej strony ;-).
Chodzi o to że masz sobie po prostu tablice poly w węźle i ten węzeł staje się teraz rodzicem. Dzielisz tego rodzica na 8 części (dzieci) i dla każdej części wykonujesz procedurę Node_QuantityObjects zwraca ona ilość poligonów która zawiera się w tym wężle dziecka. Gdy procedura wykryje ze poligon zawiera się w nodzie to dodaje go do tego noda a z rodzica z kolei go usuwa. Tą częścią zajmuje się Obj_Move(i);

Jeśli wynik procedury = 0 to usuwasz dziecko.
Jeśli (wynik procedury > wymaganej minalnej ilości poly w nodzie) to przechodzisz do dalszego sprawdzania tylko tym razem dziecko uznajesz za rodzica i dzielisz je na kolejne 8 części... Tak to roisz rekurencyjnie aż podzielisz całą geometrie.

Pozdrawiam!
Spider^*^

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

Kurde :
CYTATChodzi o to że masz sobie po prostu tablice poly jak mam tablicę poly ? mam wierzchołki w tablicy i tablicę indeksów.

i...
[quote] Gdy procedura wykryje ze poligon zawiera się w nodzie [/quote] chodzi o sprawdzenie w tablicy wierzchołków 3 tych wierzchołków należących do tego poly?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Nie przerzucaj indeksów do tablicy vertexów w węzłach tylko wskaźniki na te vertexy wtedy nie będziesz musiał ich zmieniać w czasie budowania drzewa smile.gif

CYTAT(5corpio)CYTAT
Kod który zapodałeś jest okropny i nawet nie będę próbował go zrozumieć

Hmmm podobny kod znalazłem na necie w c++. No może nie aż taki ale podobny ;p


To o niczym nie świadczy smile.gif
Masz lepsze gotowce w Delphi wystarczy szukać smile.gif

http://shadow3d.delphigl.com/esources.php
(teraz ja chce plusa lol)

Oczywiście kod potrzebuje wielu poprawek i usprawnień, ale jest przydatny jako szablon biggrin.gif

CYTATPS2. CYTATwymaganej minalnej ilości poly w nodzie

to jakaś sobie wartość, którą założe na początku ?[/syntax]


Tak

CYTATi jeszcze jedno:

[quote] Gdy procedura wykryje ze poligon zawiera się w nodzie [/quote]
Chodzi o takie sprawdzenie jak to u mnie te if-y ?

Tak smile.gif.

Pozdrawiam!
Spider ^*^

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

Kurde średnio rozumiem twoje odpowiedzi. Dobra coś pokombinuje.

[quote] Nie przerzucaj indeksów do tablicy vertexów w węzłach tylko wskaźniki na te vertexy [/quote] wskaźniki na te vertexy ? niach nie czaje tego. Możesz jaśniej ? mam tablicę z wierzchołkami, wierzchołek w formie: x,y,z. I tablicę indeksów w formie: indeks[0], indeks[1], indeks[2]. Nie mam żadnych tablic całych polygonów czy coś w tą strone. Czyli narazie zrozumiałem, że mam nie dzielić tablicy indeksów. To ona zostaje tylko jak dane np. w korzeniu ? a reszta otrzymuje hmmm wskaźniki ... a nie czaje.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

KODTo ona zostaje tylko jak dane np. w korzeniu ? a reszta otrzymuje hmmm wskaźniki ... a nie czaje.
Tak prawie. Masz całkowicie pozbyć się indeksów nie będą Ci one potrzebne w drzewie.

Jak nadal nie łapiesz lepiej przejrzyj kod ze strony którą zapodałem. Ja na tym przykładzie nauczyłem się robić oct.

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

Hmm o ile się nie myle to nie będą mi potrzebne indeksy pewnie bo wierzchołki w nodzie będą odpowiednio poukładane tak ? to tak już miałem to realizowane tym kodem wcześniejszym ale nie wiem czemu wydajność była bardzo niska wyświetlając tamto dlatego coś jest nie tak.

Chyba, że ten spadek FPS-ów z około 190-194 przy glVertex3f() i indeksów do około 184-188 to efekt uboczny Octree tongue.gif chociaż to jest przy rysowaniu całej geometrii więc i tak nigdy tak się nie stanie zato dostaje możliwość podziału teraz przestrzeni.

PS. o w tym przykładzie też renderują przez glVertexArray() to już wiem, że się pozbywa indeksów myślałem, że je się zostawia i renderuje przez glDrawRangeElements() bądź glDrawElements() bo chyba jest szybciej biggrin.gif ale jak nie to nie

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...