Autor Wątek: GL_POINTS wyświetlane jako kwadraty  (Przeczytany 4213 razy)

Offline slowbro

  • Użytkownik

# Sierpień 02, 2016, 00:58:20
Witam

W systemie cząsteczkowym, nad którym obecnie pracuje wykorzystuje GL_POINTS do wyświetlania cząstek. Pomimo tego, że w kodzie są zdefiniowane jako GL_POINTS:
glBegin(GL_POINTS);
glColor3f (1.0f, 1.0f, 1.0f);
glVertex3f(x,y,z);
glEnd();
to na ekranie pojawiają się poruszające cząstki - kwadraty zamiast kółeczek. Z tego co wyczytałem na internecie wynika, że niektóre karty graficzne nie mają zaimplementowanej pełnej obsługi GL_POINT_SMOOTH i dlatego wyświetlają kwadraty. Nawet wprowadzenie do kodu podanych propozycji rozwiązań z sieci np. dodanie glEnable(GL_POINT_SMOOTH) czy glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST) nie przynosi efektów. Wiecie może co jeszcze trzeba przestawić, aby uzyskać pożądany efekt? W ostateczności jak nie da rady to zrobię obejście w postaci tekstury jako koła nakładanej na kwadraty.

Pozdrawiam

Offline Mr. Spam

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

Offline MrKaktus

  • Użytkownik

  • +5
# Sierpień 02, 2016, 05:57:50
To API to prehistoria i jego wspieranie to meczarnia dla kazdego producenta kart graficznych wymagajaca hackow w sterownikach. Zrob przysluge sobie i innym i ubzywaj Vertex Buffer Objects (VBO) i OpenGL 3.0 jako koniecznego minimum.

Offline Mergul

  • Użytkownik

  • +1
# Sierpień 02, 2016, 08:01:28
Żeby GL_POINTS_SMOOTH działał porawnie to musisz miec włączony  GL_BLEND i ustawione jego parametry. Ponieważ point sooth dalej rysuje kwadraty, tylko ze z kółeczkami które ładnie sie mieszają z ekranem. Lepiej nałóż sam tekstury na punkty i użyj mieszania, uzyskasz identyczny efekt ^^

Offline slowbro

  • Użytkownik

  • +1
# Sierpień 02, 2016, 20:50:38
@MrKaktus: Proszę zostaw mi decyzję czy będę pisał w starym API czy nowym.

Offline Kos

  • Użytkownik
    • kos.gd

  • +6
# Sierpień 02, 2016, 21:20:11
@MrKaktus: Proszę zostaw mi decyzję czy będę pisał w starym API czy nowym.
Po to jest forum, żeby zwrócić uwagę, kiedy się pakujesz w ślepy zaułek bez dobrego powodu.

Offline slowbro

  • Użytkownik

# Sierpień 02, 2016, 23:03:46
A kto napisał, że będę cały czas kodował w starym API?:) Mam do skończenia jedną starą, zaczętą i rozgrzebaną rzecz właśnie w starym API i nie ma najmniejszego sensu rozpoczynania kodowania od nowa tego w nowym API. Po co robić dwa razy to samo;) To, że coś jest stare nie znaczy, że jest złe i niewykorzystywane. Są naprawdę stare języki programowania jak Clipper czy Cobol, a są obecnie używane do rozwijania starych systemów (np. ubezpieczeniowych czy bankowych) bo po prostu nie opłaca się przepisać ich na coś nowego. Programistę Clippera czy Cobola teraz jest obecnie baaaaaaaaaardzo trudno znaleźć:)

Podejście do wykorzystania GL_POINTS jako cząsteczek nie udało się. W związku z tym potrzebuje utworzyć w pamięci tablicę, którą wykorzystam do utworzenia tekstury w kształcie wypełnionego koła. Mam zdefiniowaną tablice:
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
oraz funkcję uzupełniającą tą tablicę wartościami :
   for (i = 0; i < checkImageHeight; i++) {
      for (j = 0; j < checkImageWidth; j++) {
         c = rand()%256;
         checkImage[i][j][0] = (GLubyte) c;
         checkImage[i][j][1] = (GLubyte) c;
         checkImage[i][j][2] = (GLubyte) c;
         checkImage[i][j][3] = (GLubyte) 255;
      }
   }
W jaki sposób należy zmodyfikować tę funkcję, aby po utworzeniu z niej tekstury uzyskać wypełnione koło (np. koloru zielonego i żółte tło)? Dzięki z góry za odpowiedzi.

« Ostatnia zmiana: Sierpień 03, 2016, 00:53:58 wysłana przez slowbro »

Offline karol57

  • Użytkownik

# Sierpień 03, 2016, 04:49:48
Punkt znajduje się wewnątrz okręgu gdy jego odległość od środka jest mniejsza od promienia. Odległość między dwoma punktami obliczasz że wzoru sqrt((x2-x1)^2 + (y2-y1)^2). Zauważ że jak znasz z góry promień to możesz porównywać z jego kwadratem i nie liczyć niepotrzebnie pierwstka (dzięki czemu możesz się ograniczyć do samych intów).

Moja rada: jak chcesz coś generować do tekstury to szukaj shaderów i je przepisu na C++. Przy okazji ogarniesz podstawy GLSL, dzięki czemu Ci łatwiej będzie ruszyć do aktualnego OpenGLa. Dodatkowo zobaczysz jak się wygładza krawędzie, aby twoje kółka nie były kanciaste.

Co do przeniesienia się na nowego OpenGLa to nie będę Ci truł bo widzę że się uparłeś.

Offline MrKaktus

  • Użytkownik

# Sierpień 03, 2016, 11:25:11
@MrKaktus: Proszę zostaw mi decyzję czy będę pisał w starym API czy nowym.
A moze posluchaj kogos kto sie na tym zna? Uzywajac tego API sam sie prosisz o klopoty. Szansa ze bedzie ono ZLE obslugiwane przez sterowniki NV,AMD,Intela rosnie zamiast malec z kazdym ich updejtem. A rosnie dlatego ze to API z przed 25 lat i ciagle jego utrzymywanie w sterownikach jest coraz ciezsze. Sam fakt ze uzywasz glBegin swiadczy o tym ze prosisz sie zeby Twoj kod crashowal (sterownik musi ten szit buforowac samemu i emulowac wewnetrznie odpowiednikami VBO).

Offline ArekBal

  • Użytkownik

# Sierpień 03, 2016, 13:36:04
Ale kolega napisał, że to zrobi w nowym projekcie. Rozumie. Więc się nie upierajcie.

Offline Mr. Hania

  • Użytkownik

# Sierpień 03, 2016, 15:41:52
Szansa ze bedzie ono ZLE obslugiwane przez sterowniki NV,AMD,Intela rosnie zamiast malec z kazdym ich updejtem. A rosnie dlatego ze to API z przed 25 lat i ciagle jego utrzymywanie w sterownikach jest coraz ciezsze. Sam fakt ze uzywasz glBegin swiadczy o tym ze prosisz sie zeby Twoj kod crashowal (sterownik musi ten szit buforowac samemu i emulowac wewnetrznie odpowiednikami VBO).

Nie mam zielonego pojęcia o tym w jaki sposób pisze się sterowniki do kart graficznych, ale chyba aż tak bym nie przesadzał - emulacja starych API OpenGL za pomocą wywołań z nowszych wersji wydaje się być czymś stosunkowo trywialnym, przynajmniej w porównaniu do złożoności tego sterownika "właściwego". Jeżeli goście z nVidii mają czas i chęci na optymalizacje poprzez wciskanie "ifów" pod kątem konkretnych gier, to nie widzę czemu taka warstwa tłumacząca miałaby być jakimkolwiek problemem. Szczególnie że jest to zadanie w zasięgu osoby nawet bardzo pobieżnie zaznajomionej z OpenGL (takiej jak ja). Jasne, pewnie trzeba pamiętać o bardzo wielu kruczkach w specyfikacji ale ogólnie to jest robota "na raz" i nie wiem czemu wsparcie by miało być gorsze z każdą aktualizacją.

Offline Vipa

  • Redaktor

# Sierpień 03, 2016, 19:43:36
Nie no Kaktus ma rację. Nie ma gwarancji, że to co się tak napisze i działa, będzie działać za pół roku w takim samym stopniu na nowszej wersji sterownika.

Z drugiej jednak strony czasami trzeba się cofnąć i tyle. Sam niekiedy musiałem tak zrobić i musiałem tłumaczyć każdemu dlaczego tak a nie inaczej i poświęcać na to zdecydowanie za dużo czasu.
Warto wtedy właśnie pomóc, bo utrzymanie kodu opartego na begin-end może być / jest dużo trudniejsze.

A przyczyn może być od cholery - sam mam starego laptopa, na którym muszę tak naklepać i tyle. I tłumacz wtedy każdemu, że to mała gierka dla żony, co skutkuje zamiast pomocą, to stwierdzeniami żeby żona kupiła nowy komputer :).

Offline MrKaktus

  • Użytkownik

  • +1
# Sierpień 04, 2016, 14:14:25
Nie mam zielonego pojęcia o tym w jaki sposób pisze się sterowniki do kart graficznych...
I dlatego reszta wywodu niestety nie jest prawdziwa. To nie jest robota "na raz", to są osobo-miesiące implementacji wstępnej a potem utrzymanie. HW sie zmienia z kazda generacja kart, np. to co kiedys bylo Fixed Function teraz moze byc emulowane w shaderach, etc. W rezultacie wspieranie glBegin/glEnd i innych zaszlosci z czasów gdy renderowano jednokolorowe trójkąty jest ciągłą udręką a nie czyms cos sie zrobi raz i zapomni.

Dlatego szczerze polecam nawet nie udzielać odpowiedzi na pytania dotyczace deprecated API. To jedyny sposób żeby zmusić ludzi do nauczenia się właściwego korzystania z biblioteki. Jeżeli ktoś już musi samemu pisać w OpenGL zamiast używać jakiegoś frameworka, to oczekuje od niego aby poświęcił czas i używał go właściwie albo wcale. To nie jest personalny przytyk - po prostu szanujmy swoj czas na wzajem, promujmy poprawne wzorce.

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 04, 2016, 17:36:07
szczerze polecam nawet nie udzielać odpowiedzi na pytania dotyczace deprecated API.
A co robić z ludźmi, którzy hobbystycznie piszą coś na platformy na które nowszych wersji OpenGL nie ma? Na takich platformach te funkcje nie są deprecated. :) Liczą się tylko ci z "mainstreamowych" platform, a fani niszowych rozwiązań powinni siedzieć cicho w swoich piwnicach? ;)

Offline Kos

  • Użytkownik
    • kos.gd

  • +1
# Sierpień 04, 2016, 18:14:05
@up dla Ciebie jednego można zrobić wyjątek ;-)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 04, 2016, 19:25:23
@up dla Ciebie jednego można zrobić wyjątek ;-)
Na taką odpowiedź właśnie liczyłem. :-) Na pewno z tej możliwości jeszcze skorzystam. Ale na glBegin()/glEnd() nie liczcie, bo tego się już nawet na AmigaOS/MorphOS nie używa. :-)