Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.02.2016, 09:44

OpenGL: Punkte und einfache Striche werden nicht dargestellt

Vorab: ja, ich weiß dass ich auf eine Uralt-OpenGL-Schnittstelle aufsetze. Leider ist meine Applikation für Systeme vorgesehen, bei denen noch nicht mal OpenGL2.1 garantiert ist, daher...

Ich habe ein Problem beim Zeichnen von einzelnen Punkten oder kurzen Strichen, die werden einfach nicht dargestellt:

C-/C++-Quelltext

1
2
3
glBegin(GL_POINT);
glVertex3f();
glEnd();


und

C-/C++-Quelltext

1
2
3
4
glBegin(GL_LINE_STRIP);
glVertex3f();
glVertex3f();
glEnd();


zeigen schlichtweg gar nichts an. Sobald (im zweiten Fall) aber ein weiterer Aufruf von glVertex3f() hinzukommt, wird korrekt gezeichnet. Hat jemand eine Idee, was hier die Ursache sein könnte?

Initialisiert wird die Schnittstelle mit

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);

glEnable(GL_LINE_SMOOTH);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
glShadeModel(GL_SMOOTH);
glHint( GL_POINT_SMOOTH_HINT, GL_NICEST );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.5f, 0.5f, -0.5f, 0.5f, 1.0f, 1000.0f);


Danke :-)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.02.2016, 11:16

Vielleicht die Koordinaten? Sieht eigentlich valide aus, wenn man Code von vor 20 Jahren als valide betrachten will. Aber ich vermute mal, es geht um die Erkundung der Grundlagen. Und da setzen heutige 3D-API leider eine ziemliche Hemmschwelle.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

26.02.2016, 12:30

Die Koordinaten passen, daran liegt es nicht.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

26.02.2016, 16:34

Das machst Du woran fest? Immerhin stehen in Deinem Beispielcode gar keine Koordinaten, sondern nur leere glVertex3f()-Aufrufe.

Nuja, Dein Problem, nicht meins.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

26.02.2016, 19:37

Das machst Du woran fest?


Ich mache einen Breakpoint an die Stelle im Code und sehe mir die Koordinaten an!? Ganz simpel also.

Alternativ kann ich noch in einen Modus umschalten, in dem die gleichen Koordinaten mit Windows-GDI-Funktionen gezeichnet werden und da passt die Darstellung dann auch.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

26.02.2016, 20:14

Das machst Du woran fest?


Ich mache einen Breakpoint an die Stelle im Code und sehe mir die Koordinaten an!? Ganz simpel also.

Und was für Werte siehst du da so?

7

01.03.2016, 08:58

Wenn er korrekt zeichnet steht da z.B.:

glBegin(GL_LINE_STRIP)
glVertex3f(-0.86199999999999999,0.0,28.311000000000000);
glVertex3f(0.14069999999999999,0.0,28.289899999999999);
...


Wenn nicht gezeichnet wird, werden z.B. diese Koordinaten verwendet:

glBegin(GL_POINT);
glVertex3f(-0.86199999999999999,0.0,28.311000000000000);
glEnd();

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

8

01.03.2016, 10:01

Tja, sieht soweit valide aus. Könnte noch an ner Menge mehr Dingen scheitern, zum Beispiel am Depth Test, weil Du ja nirgends clearst, oder am fehlenden glSwapBuffers(). Aber all das sollte auch scheitern, wenn Du weitere glVertex()-Aufrufe da stehen hast. Du sagst aber, dass mit einem zusätzlichen glVertex()-Call das Ganze funktioniert. Und das klingt reichlich wirr.

Allerdings bin ich da auch kein Experte - diese Art der Programmierung ist wie gesagt uralt und wird seit sicher 10 Jahren von niemandem mehr gemacht. Kann also auch ganz banal sein, dass Du in einen Treiber-Bug gerannt bist, weil diesen Teil der API niemand mehr pflegt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

9

02.03.2016, 12:48

OK, ich habe es gefunden: Schuld war GL_POINT, alles was davor gezeichnet werden sollte, wurde - inklusive des Punktes - nicht dargestellt. Wenn ich alle Punkte durch ein

C-/C++-Quelltext

1
2
3
4
glBegin(GL_LINE_STRIP);
glVertex3f(x,y,z);
glVertex3f(x+0.00001,y+0.00001,z+0.00001);
glEnd();


ersetze, dann funktioniert es - allerdings sind die "Punkte" dann so klein, dass sie kaum zu erkennen sind.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

02.03.2016, 12:50

Oh, natürlich, es muss selbstverständlich GL_POINS heißen, nicht GL_POINT. GL_POINT ist was anderes, wenn du GL_POINT an glBegin() übergibst, wird glBegin() fehlschlagen. Daher zahlt es sich immer aus, wenn man ein Problem hat, per glGetError() zu schauen, ob irgendwo was failed... ;)

Werbeanzeige