2017-11-09 3 views
0

I eine Funktion in C++ implementiert, um eine N Segmente für einen Dreiecksstreifen (2 x N Dreiecke) zu erzeugen später gedruckt werden soll (wie GL_TRIANGLE_STRIP) durch eine andere Funktion. Hier zeige ich Ihnen, was ich bisher habe:Dreiecksstreifen zeigt nicht richtig mit OpenGL

void strip(
    std::uint32_t N, 
    std::vector<glm::vec3>* vertices) 
{ 

    vertices->clear(); 

    for (std::uint32_t j=0; j<=N; ++j) 
    { 
     for (std::uint32_t i=1; i<=N; ++i) 
     { 
      float x = (float)i/(float)N; 
      float y = (float)j/(float)N; 
      vertices->push_back(glm::vec3(x, y, 0)); 
     } 
    } 
} 

So wäre es scheinen, wie die folgende Abbildung (Für N = 3):

^
    | ---------- 
    | | /| /| /| 
    y | |/ |/ |/ | 
    | ---------- 
    | 
    |--------------> 
      x 

Aber in der Tat scheint es, wie dies:

My triangle strip

Jede Beratung ist damit? Meine Gedanken sind, dass ich die Punkte nicht in der richtigen Reihenfolge erzeuge.

+0

Ihr Beispiel (N = 3) Sie zeigt 6 Dreiecke. Das ist nicht 2 * N * N = 2 * 3 * 3 = 18 – BDL

+0

Wo ist der Code, der die Indizes generiert? Sollte es nicht sein oder 'j = 1; j Rabbid76

+0

@BDL Entschuldigung, ich habe versehentlich ein extra * N * eingefügt. Bearbeitet – giorgioW

Antwort

0

Ein Dreieck mit den Scheitelpunkten A, B, C, D, E, ... bildet die Dreiecke ABC, BCD, CDE und so weiter.

Meine Gedanken sind, dass ich die Punkte nicht in der richtigen Reihenfolge erzeuge.

Ja. Was Sie erzeugen ist

0 1 2 3 
4 5 6 7 
8 9 10 11 

Sie sind also viele deformierte Dreiecke ohne Bereich überhaupt bekommen, und nur einige seltsame Dreiecke erhalten die verschiedenen Linien verbinden (wie 2 3 4 3 4 5).

Was sollten Sie erzeugen ist

0 2 4 6 
1 3 5 7 

Beachten Sie, dass, wenn Sie eine zusätzliche Zeile hinzufügen, sehen Sie die unteren Eckpunkte aus der vorherigen Reihe, wie den oberen Ecken der neuen Zeile zu wiederholen. Beachten Sie auch, dass Sie den Dreiecksstreifen für jede Zeile neu starten müssen.

Ein effizienterer Ansatz könnte sein, dass Sie die Scheitelpunkte genau so erzeugen, wie Sie jetzt sind, und in indexed rendering suchen, mit dem Sie die Scheitelpunkte zwischen verschiedenen Primitiven einfach wiederverwenden können.

2

Ihre Logik ist nicht gut, um einen Streifen aus Dreiecken zu erzeugen. Lassen Sie mich versuchen, meine zu erklären:

^
    | 0--2--4--6 
    | | /| /| /| 
    y | |/ |/ |/ | 
    | 1--3--5--7 
    | 
    |--------------> 
      x 

Wie Sie, 0 Dreieck von Eckpunkten 0 zusammengesetzt ist, 1 und 2, während Dreieck 1 von Eckpunkten zusammengesetzt ist 1, 2 und 3, und so weiter. Um diesen Streifen zu erzeugen, müssen Sie die ungeraden Indizes in einer Reihe und die geraden Indizes in einer anderen Reihe erzeugen. Lassen Sie uns versuchen mit Code, in diesem Fall, Vertices:

void strip(std::uint32_t N, std::vector<glm::vec3>* vertices) 
{ 
    vertices->clear(); 

    for (std::uint32_t j=0; j < N + 1; ++j) 
    { 
     float x = (float)j/(float)N; 
     vertices->push_back(glm::vec3(x, 1, 0)); // even row 
     vertices->push_back(glm::vec3(x, 0, 0)); // odd row 
    } 
} 
+0

@ Rabbid76 Jetzt verstehe ich, wie es funktioniert. Aber jetzt, wenn ich die Funktion zum Drucken von ihnen und auch die entsprechenden Farben zu implementieren, scheint es, dass es nicht funktioniert. Mache ich richtig?\t 'glBegin (GL_TRIANGLE_STRIP); \t für (uint i = 0; i giorgioW

Verwandte Themen