5corpio Napisano Grudzień 23, 2005 Zgłoś Share Napisano Grudzień 23, 2005 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 More sharing options...
Spider100 Napisano Grudzień 23, 2005 Zgłoś Share Napisano Grudzień 23, 2005 Witam!Kod który zapodałeś jest okropny i nawet nie będę próbował go zrozumieć . 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 More sharing options...
5corpio Napisano Grudzień 23, 2005 Autor Zgłoś Share Napisano Grudzień 23, 2005 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 More sharing options...
Spider100 Napisano Grudzień 24, 2005 Zgłoś Share Napisano Grudzień 24, 2005 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 CYTAT(5corpio)CYTATKod 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 ;pTo o niczym nie świadczy Masz lepsze gotowce w Delphi wystarczy szukać http://shadow3d.delphigl.com/esources.php(teraz ja chce plusa lol)Oczywiście kod potrzebuje wielu poprawek i usprawnień, ale jest przydatny jako szablon CYTATPS2. CYTATwymaganej minalnej ilości poly w nodzie to jakaś sobie wartość, którą założe na początku ?[/syntax]TakCYTATi 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 .Pozdrawiam!Spider ^*^ www.spider.dathox.com Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Grudzień 24, 2005 Autor Zgłoś Share Napisano Grudzień 24, 2005 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 More sharing options...
Spider100 Napisano Grudzień 24, 2005 Zgłoś Share Napisano Grudzień 24, 2005 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 More sharing options...
5corpio Napisano Grudzień 24, 2005 Autor Zgłoś Share Napisano Grudzień 24, 2005 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 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 ale jak nie to nie Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.