Autor Wątek: [c++] Opengl opakowany w obiekty, czy warto?  (Przeczytany 38688 razy)

Offline Q

  • Użytkownik

# Czerwiec 23, 2014, 02:31:09
Cytuj
Na poważnie, to jak wyobrażasz sobie tą obiektowość i jej użycie? Jak ma Ci ułatwić pracę?
No już nie raz pokazywałem kod i jak ma to wyglądać.
Nie mi ma ułatwić prace tylko ludziom którzy zabiorą sie za projekt razem ze mną.
Cytuj
Bo jak dla mnie to ty się do tego zabierasz od d... strony. Obiektowość powinna być tak jakby "naturalna", jeśli musisz na siłę upychać to w obiekty to nie tak.
Jeśli wszystko będzie przemyślane to dlaczego nie?
Mój ostatni projekt w javie był pisany strukturalnie, ale po pewnym czasie trudno sie go debugowało.
Zajeło mi 3 tygodnie przepisanie tego na obiektowy kod.
Chce tego uniknąć w tym projekcie, dlatego wole od razu zacząć projekt od właściwej strony.
Cytuj
A poza tym to działa ci coś?
Na razie nie, do końca miesiąca siedzę w pracy ;/ Ale od lipca mam urlop (cały miesiąc) i zamierzam przeznaczyć go na mój projekt. Obecnie przebudowuje kod tak by coś sie już wyświetlało. Ale i tak 90% zajmuje mi planowanie jak to uprościć do maximum.
Cytuj
to jest "thinking in java"
No niestety, java mi sie podobała, obiektowość traktuje jako posegregowane w drzewa funkcje.
Dzięki temu łatwo było mi znaleźć coś w programie napisanym w javie nawet jak nie wiedziałem co i jak.
Cytuj
100 vao to juz przegięcie, a ty piszesz o 18 k... widocznie ich nie rozumiesz
webgl wyświetlał mi 1600 VAO i całkiem nieźle sobie radził.

Obecnie mam problem jak zrobić by instancja obiektu odpowiedzialnego za shadery była dostępna w innych obiektach tak by móc używać jej metod i właściwości, ale bez przekazywania jej w postaci argumentu np w konstruktorze.
chce np móc użyć metode wysyłającą macierz widoku do shadera wierzchołków w metodzie kamery:

psełdokod:
Shader shader("plik");
...
clasa camera::update()
{
   matrixCamera = ... // tworzenie marixa :p
   shader.send(matrixCamera);
}
 
Ogólnie to nie mam pomysłu jak zarzadzać shaderem w różnych obiektach.
« Ostatnia zmiana: Czerwiec 23, 2014, 03:05:53 wysłana przez Q »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline DezerteR

  • Użytkownik

# Czerwiec 23, 2014, 02:58:20
Niemniej duża ilość małych buforów jest zbędnym obciążeniem GPU, oprócz zarządzania tym dochodzi jeszcze koszt przełączenia bufora. glDrawRangeElements i jedyne co musisz trzymać to indeks początkowy i końcowy modelu, prościej?

Dla ludzi którzy będą z tobą pracować, jeśli będą znali ogla, nauka kolejnego api może byc irytująca.

KISS*

Offline Xirdus

  • Redaktor

# Czerwiec 23, 2014, 03:08:22
obiektowość traktuje jako posegregowane w drzewa funkcje.
To nie jest obiektowość. Obiekt jest to byt jakiejś klasy, posiadający jakieś zachowania. Klasa te zachowania definiuje. Dziedziczenie pozwala mieć dwa obiekty tej samej klasy, ale o różnych zachowaniach. Korzystanie z wyżej wymienionych cech to obiektowość. "Drzewiastość funkcji" to właśnie programowanie strukturalne - przeczytaj sobie Wikipedię.

BTW. Nie myli ci się VAO z VBO?

Offline Q

  • Użytkownik

# Czerwiec 23, 2014, 03:23:49
Myślałem że tylko ja nie śpię :)
Cytuj
glDrawRangeElements i jedyne co musisz trzymać to indeks początkowy i końcowy modelu, prościej?
Niby prościej. A co z teksturą? nie trzeba jej przełączyć przy przełączaniu VAO?
Cytuj
BTW. Nie myli ci się VAO z VBO?
Nie, ale o tej godzinie nie wiem czy moje zdania sa logiczne i w moim rozumowaniu może wkraść się błąd.
Cytuj
To nie jest obiektowość. Obiekt jest to byt jakiejś klasy, posiadający jakieś zachowania. Klasa te zachowania definiuje. Dziedziczenie pozwala mieć dwa obiekty tej samej klasy, ale o różnych zachowaniach. Korzystanie z wyżej wymienionych cech to obiektowość. "Drzewiastość funkcji" to właśnie programowanie strukturalne - przeczytaj sobie Wikipedię.
Sorry źle się wyraziłem, nie miałem na mysli że to traktuje dosłownie, tylko że podoba mi sie ten aspekt obiektowości.
Wiem na czym polega obiektowość.

Offline DezerteR

  • Użytkownik

# Czerwiec 23, 2014, 09:55:19
Vao grupuje informacje o kilku vbo, także mówiąc o vao mówimy o vbo.

A co z teksturą? nie trzeba jej przełączyć przy przełączaniu VAO?
No trzeba, ale mówiliśmy o geometrii.
Cytuj
psełdokod:
Shader shader("plik");
...
clasa camera::update()
{
   matrixCamera = ... // tworzenie marixa :p
   shader.send(matrixCamera);
}
 

Ogólnie to nie mam pomysłu jak zarządzać shaderem w różnych obiektach.

Zrób singleton/globala a najlepiej nie rób tego. A, skąd shader ma wiedzieć że ustawiłeś mu macierz kamery, a nie czegoś innego? Po co kamera ma cokolwiek wiedzieć o shaderze, niech będzie samodzielnym bytem i udostępnia odpowiednie informacje.

Co chcę ci powiedzieć to że opakowując ogla w obiekty będziesz miał 2x więcej debugowania. A nawet więcej bo z tego co widzę to się dopiero uczysz więc nawet nie wiesz czego nie wiesz.
Zauważ ze chcę tu oddzielić opakowywanie ogla w obiekty od opakowywania pozostałych rzeczy w obiekty. Pierwsze jest bez sensu, drugie ma sens, ale tu potrzeba doświadczenia w pisaniu silników i ich organizacji.

Offline Q

  • Użytkownik

# Czerwiec 24, 2014, 09:18:21
Cytuj
No trzeba, ale mówiliśmy o geometrii.
Ale chyba trzeba ja zmienić gdy wyświetlamy inny element geometrii?
glDrawRangeElements(GL_TRIANGLES, 0, 2, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices);
// tu zmiana textury
glDrawRangeElements(GL_TRIANGLES, 3, 5, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices+3);
Czy można za pomoca glDrawElementsInstanced wyświetlić tak jak w  glDrawRangeElements obiekty z jakiegoś przedziału bufora, bo zdaje się że nie? (niestety jestem znów w pracy i możliwosci szukania w necie mam mocno ograniczone)
Poza tym mam pytanie odnośnie textur.
Czy raz wysłaną texturę za pomoca uniformu moge zmieniać za pomoca bind, czy też za każdym razem muszę ja znów wysyłać jako uniform? Z tego co sie orientuje to program shadera działa jako klient-serwer wiec istnieje chyba możliwośc że wyrysuje mi geometrie zanim zaktualizowana zostanie textura w uniformie?
Cytuj
A, skąd shader ma wiedzieć że ustawiłeś mu macierz kamery, a nie czegoś innego?
No bede musiał zrobic odpowiednie metody do aktualizacji odpowiednich uniformów.
Cytuj
A nawet więcej bo z tego co widzę to się dopiero uczysz więc nawet nie wiesz czego nie wiesz.
Gdy zaczynałem ten temat nie wiedziałem prawie nic. Był tylko pomysł, teraz mam juz całkiem sporo kodu i wiedzy jak to urzeczywistnić.
Cytuj
Pierwsze jest bez sensu, drugie ma sens, ale tu potrzeba doświadczenia w pisaniu silników i ich organizacji.
To przypomina żądanie pracodawcy by osoba zaraz po studiach miała doświadczenie. Chyba na czymś to doswiadczenie trzeba zdobyć?
Na razie zdobywam informacje co mozna a co nie, jak coś się robi. Od lipca mam urlop i dopiero wtedy zamierzam na powaznie do tego usiąść.
Cytuj
Zauważ ze chcę tu oddzielić opakowywanie ogla w obiekty od opakowywania pozostałych rzeczy w obiekty. Pierwsze jest bez sensu,
Obiektowość + opengl to chyba jakies tabu? Przynajmniej takie odnosze wrażenie po waszych reakcjach na tem pomysł.
Pownienem napisać w temacie że to wątek w którym można spotkać rewolucyjne i śmiałe idee.
Nie raz bralem się za cos gdy inni mówili: "Nie znasz sie na tym", "to głupie", "nie uda Ci się" itp.
Ja jednak zawsze udowadniałem że mam rację, może opengl + obiekty to głupi pomysł ale chyba można sprawdzić jak to będzie wyglądało? 

Offline albireo

  • Użytkownik

# Czerwiec 24, 2014, 09:46:01
Czy można za pomoca glDrawElementsInstanced wyświetlić tak jak w  glDrawRangeElements obiekty z jakiegoś przedziału bufora, bo zdaje się że nie? (niestety jestem znów w pracy i możliwosci szukania w necie mam mocno ograniczone)
Oczywiście, że można, jeśli użyłbyś glDrawElements zamiast glDrawRangeElements (pomijając drugi i trzeci argument), to uzyskasz taki sam wynik (użycie glDrawRangeElements zamiast glDrawElements ma sens tylko jeśli nie korzystasz z VBO).
Poza tym mam pytanie odnośnie textur.
Czy raz wysłaną texturę za pomoca uniformu moge zmieniać za pomoca bind, czy też za każdym razem muszę ja znów wysyłać jako uniform? Z tego co sie orientuje to program shadera działa jako klient-serwer wiec istnieje chyba możliwośc że wyrysuje mi geometrie zanim zaktualizowana zostanie textura w uniformie?
Nie istnieje taka możliwość (pomijając bugi w driverze), jeśli najpierw ustawisz teksturę a później wywołasz rysowanie, to zostanie to narysowane ustawioną teksturą.

Offline Xirdus

  • Redaktor

# Czerwiec 24, 2014, 11:15:02
Wprawdzie doświadczenia z OGL mam mizernie mało, niecaly miesiac, ale parę rzeczy z tego wątku mi nie pasuje.

Vao grupuje informacje o kilku vbo, także mówiąc o vao mówimy o vbo.
A nie jest przypadkiem tak, że VAO przechowuje informacje jak używać zbindowanego VBO, przy czym mozemy w dowolnej chwili (pomiedzy drawcallami) zmienic VBO dla danego VAO, i VAO dla danego VBO?

Czy raz wysłaną texturę za pomoca uniformu moge zmieniać za pomoca bind, czy też za każdym razem muszę ja znów wysyłać jako uniform?
Uniformem jest chyba texture unit, a nie sama tekstura?

użycie glDrawRangeElements zamiast glDrawElements ma sens tylko jeśli nie korzystasz z VBO
Moglbys rozwinac? Z tego co wyczytalem, i jedno i drugie korzysta z VBO.

Nie istnieje taka możliwość (pomijając bugi w driverze), jeśli najpierw ustawisz teksturę a później wywołasz rysowanie, to zostanie to narysowane ustawioną teksturą.
Koledze Q chodzilo chyba o zmiane miedzy drawcallami. AFAIK podbindowanie tekstury pod ten sam texture unit powinno dac natychmiastowy efekt bez zadnych dodatkowych zabaw?

Offline DezerteR

  • Użytkownik

# Czerwiec 24, 2014, 11:38:46
A nie jest przypadkiem tak, że VAO przechowuje informacje jak używać zbindowanego VBO, przy czym mozemy w dowolnej chwili (pomiedzy drawcallami) zmienic VBO dla danego VAO, i VAO dla danego VBO?

Yhm, do Vao można podpiąć kilka vbo, po prostu zamiast wołać vbo, ustawiać wszystkie atrybuty, divisory, to robimy to raz dla vao, i potem wołamy tylko vao. Nie widzę przeszkód by można było zmieniać podpięte vbo, aczkolwiek nie próbowałem.

Offline albireo

  • Użytkownik

# Czerwiec 24, 2014, 11:44:49
Moglbys rozwinac? Z tego co wyczytalem, i jedno i drugie korzysta z VBO.
Dodatkowe parametry glDrawRangeElements, to zakres użytych  indeksów, więc ma to znaczenie w zasadzie tylko w sytuacji kiedy dane wierzchołków przesyła się z pamięci systemu do pamięci karty, czyli gdy korzysta się z vertex array (nie mylić z VAO) lub z VBO często modyfikowanych (GL_STREAM_DRAW), ale w tej drugiej sytuacji i tak normalnie korzysta się ze wszystkich danych z bufora, więc nie ma to w zasadzie znaczenia. Może to też mieć znaczenie kiedy dane potrzebne do narysowania sceny nie mieszczą się w pamięci karty graficznej, ale wtedy i tak wydajność leci.

Offline ArekBal

  • Użytkownik

# Czerwiec 24, 2014, 12:03:21
Wprawdzie doświadczenia z OGL mam mizernie mało, niecaly miesiac, ale parę rzeczy z tego wątku mi nie pasuje.
A nie jest przypadkiem tak, że VAO przechowuje informacje jak używać zbindowanego VBO, przy czym możemy w dowolnej chwili (pomiędzy drawcallami) zmienić VBO dla danego VAO, i VAO dla danego VBO?

Tak jest... stąd absurdalnym pomysłem jest potrzeba 16k vao

W dokumentacji jest zasugerowane niechcący że VBO są składnikami VAO. Ale należy to rozumieć w ten sposób że bufory do rysowania wymagają tych deklaracji.
« Ostatnia zmiana: Czerwiec 29, 2014, 13:45:34 wysłana przez ArekBal »

Offline Q

  • Użytkownik

# Czerwiec 29, 2014, 10:17:22
Co do trzymania całej geometrii w jednym vao to ma to taka wadę że gdy próbujemy renderować dwa obiekty przy pomocy funkcji glDrawElementsInstanced jeden po drugim to gl_InstanceID ulega resetowi.
// wypisujemy 5 elementów
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT,(GLvoid*)0, 5);
// wypisujemy kolejne 5 elementów
// gl_InstanceID znów jest ustawione na 0
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT,(GLvoid*)0, 5);

Offline DezerteR

  • Użytkownik

# Czerwiec 29, 2014, 11:30:05
Byłoby bardzo niewygodne gdyby nie ulegało, mam wrażenie że czegoś o instancingu nie zrozumiałeś.


Offline Q

  • Użytkownik

# Czerwiec 29, 2014, 12:27:37
No tak ale to eliminuje jeden VAO do wyświetlania całej geometrii. trzeba utworzyć ich co najmniej kilka.

Offline DezerteR

  • Użytkownik

# Czerwiec 29, 2014, 13:05:15
Nie, widzę że nie czytałeś dokumentacji: http://www.opengl.org/sdk/docs/man3/.
I teraz tak,
void glDrawElementsInstanced(GLenum mode,  GLsizei count,  GLenum type,  const void * indices,  GLsizei primcount);cont: ilość indeksów modelu
indices: wskaźnik na pierwszy indeks, można liczyć jako pierwszy indeks*sizeof(type)
primcount: ilość instancji

Dla geometrii o takiej samej budowie wierzchołka wystarczy jedno VAO.