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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

19.11.2009, 16:29

OpenGL: Frage zu Antiaaliasing, Linien-Polygonen-Überlappung

Hallo

Ich rendere einen Würfel mit folgenden Voreinstellungen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    glEnable (GL_POLYGON_SMOOTH);
    glEnable (GL_LINE_SMOOTH);
    glEnable (GL_POINT_SMOOTH);
    glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
    glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
    glHint (GL_POINT_SMOOTH_HINT, GL_NICEST);
    glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


Verzichte ich auf GL_POLYGON_SMOOTH, sieht das Ergebnis wie erwartet 'normal' aus.
Sonst bekomme ich merkwürdige Linien zu sehen, die jede Fläche des Würfels durchschneiden und wohl die Kanten der Dreiecke sind, aus denen der Würfel besteht:


(Link)


Gibt es eine Möglichkeit, GL_POLYGON_SMOOTH zu verwenden, ohne mit diesem Phänomen rechnen zu müssen?

Bei dem obigen Bild rendere ich außerdem ein rotes Viereck mittels GL_LINE_LOOP.
Obwohl Z-Buffer & Co. aktiviert sind, sehe ich diese Markierung auch wenn sie eigentlich auf der Rückseite des Würfels ist.
Woran liegt das? Wie korrigiere ich das?
Wenn ich die Markierung einfach vor dem Würfel zeichne, dann verschwimmen 2 der 4 Seiten stets mit dem Würfel, so dass sie kaum sichtbar sind.

Vielen Dank im Voraus
<< an dieser Stelle ist eine Signatur verstorben >>

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

19.11.2009, 17:04

Das Problem mit den Polygonkanten ist bekannt. Es resultiert vermutlich aus dem Versuch heraus die Polygonkanten geglättet (d.h. semitransparent Pixel werden eingerechnet) darzustellen. Bei adjazenten Dreiecken passiert das eben genauso, und die Übergänge sind nicht mehr fließend.
Wieso willst du überhaupt POLYGON_SMOOTH verwenden? Oft gibt es dafür nichtmal Hardwareunterstützung.

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

19.11.2009, 17:11

Wie soll man sonst erreichen, dass die Kanten meines Würfels geglättet werden?

Hab das jetzt mal rausgenommen. Bleibt das Problem mit der Markierung:


(Link)

(Markierung vor Würfel gerendert)


(Link)

(Markierung nach Würfel gerendert)

Jemand eine Idee?
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.11.2009, 17:32

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=46

Ich denk das wird dir weiterhelfen ;)

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

19.11.2009, 18:01

Ich verwende SFML, um meinen GL-Context zu erstellen (sf::RenderWindow), kennt jemand eine Möglichkeit, das damit zu kombinieren?
<< an dieser Stelle ist eine Signatur verstorben >>

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

19.11.2009, 18:15

Du kannst doch in den WindowSettings den Antialiasing-Level angeben.

Zu deinem anderen Problem, da wäre ein Beispiel hilfreich, dass das Verhalten zeigt.

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

7

19.11.2009, 18:41

Jop, da hab ich einfach mal 4 angegeben, aber wie du auf den Screenshots siehst, da ist nix von Antialiasing zu sehen.

C-/C++-Quelltext

1
2
sf::ContextSettings settings (24, 8, 8);
m_pWindow = new sf::RenderWindow (sf::VideoMode (800, 600, 32), sWindowTitle, sf::Style::Close, settings);


Es handelt sich um SFML 2.0 wenn ich mich nicht täusche.


Zu meinem zweiten Problem: Ich denke ich werde nachher mal eine Minimalanwendung erstellen, wo dieses Verhalten gezeigt wird.
Hier aber schon mal etwas Code aus der jetzigen.

Diese Prozedur wird für jede Würfelseite ausgeführt:

C-/C++-Quelltext

1
2
3
glBegin (GL_QUADS);
// Hier werden mit glVertex3f die 4 Vertices der Würfelseite angegeben

glEnd ();


Direkt im Anschluss dann, wobei face.vertices eine Liste der Vertices einer Würfelseite referenziert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
glLineWidth (3.5f);
glBegin (GL_LINE_LOOP);
for (Face::Vertices::const_iterator itVertices = face.vertices.begin (); itVertices != face.vertices.end (); ++itVertices)
{
    const Vector3f& v = itVertices -> vector;
    glColor3ub (255, 120, 120);
    glVertex3f (v.x, v.y, v.z);
}
glEnd ();
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

19.11.2009, 19:02

schon mit

C-/C++-Quelltext

1
2
3
4
5
glEnable(GL_MULTISAMPLE_ARB);

// Render The Scene


glDisable(GL_MULTISAMPLE_ARB);


versucht?

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

9

19.11.2009, 19:14

Ja, und auch mit GL_MULTISAMPLE (ohne _ARB). Stets dasselbe Ergebnis.

EDIT: Morgen früh gehts erstmal bis Sonntag nach Stuttgart / Tübingen und heute Abend bin ich zu müde für die Minimalanwendung.
<< an dieser Stelle ist eine Signatur verstorben >>

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

23.11.2009, 13:06

Hier nun die versprochene Minimalanwendung, die meine beiden Probleme aufzeigt.
Der Quelltext findet sich hier zum Ansehen und hier zum Runterladen mit Makefile.

Kompilieren mit:

Quellcode

1
g++ main.cpp -o main -lsfml-window -lsfml-graphics -lsfml-system -lglut
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige