2017-11-04 19 views
-2

Ich konnte ein einzelnes Objekt mit einem Array von Vertices zeichnen. Allerdings hat es mir viel Mühe gemacht, mehrere Objekte zu zeichnen.Wie zeichne mehrere Dreieck in OpenGL C++?

Ich habe ein Array von Daten wie diese und drei Eckpunkte machen ein Dreieck:

-0.0570917f,0.490469f,-0.142433f 
-0.0581126f,0.5f,-0.160615f 
-0.0651903f,0.490827f,-0.147409f 
-0.0501295f,0.499886f,-0.158146f 
-0.0491703f,0.49039f,-0.140236f 
-0.0422027f,0.499864f,-0.157942f 
-0.041255f,0.49031f,-0.138206f 
-0.0333885f,0.490314f,-0.137995f 
-0.0967512f,0.48302f,-0.150394f 
... 

Und ich versuche mehrere Dreiecken mit dem folgenden Code zu machen:

// this array contains arrays with one vertex (three elements) 
vector<vector<GLfloat>> pointVertex; 

// Render OpenGL here 
for (int i = 0; i < pointVertex.size(); i++) { 
    vector<GLfloat> temp = pointVertex[i]; 
    GLfloat *pointVertexArrayPoint = temp.data(); 
    glEnable(GL_POINT_SMOOTH); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, pointVertexArrayPoint); 
    glDrawArrays(GL_LINES, 0, temp.size()); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisable(GL_POINT_SMOOTH); 
} 

Nun, ich bin ein Ergebnis bekommen, aber alles beginnt am selben Punkt. Ich möchte, dass es mehrere separate Dreiecke darstellt. Wie kann ich es ändern?

+0

@Brandon Möchten Sie eine Antwort bilden ? Sieht so aus, als hättest du eine Ahnung, wie es geht. –

+0

Ich bin mir nicht sicher, was Sie versuchen zu tun. Ich schätze, du willst drei Linien für jedes Dreieck rendern? Von Knoten 0 zu 1, 1 zu 2 und 2 zu 0? Zur Zeit übergeben Sie den Zeiger an einen Eckpunkt und teilen OpenGL mit, dass er 3 Eckpunkte daraus lesen soll. Für die letzten beiden Iterationen lesen Sie zumindest außerhalb Ihres Gedächtnisses. – BDL

+0

@ BDL. Ich möchte mehrere unabhängige Dreiecke darstellen. Und drei Ecken bilden eins. –

Antwort

3

gibt es ein paar Möglichkeiten, dies von der Technik ohne Abweichen zu beseitigen Sie verwenden (Legacy-Pipeline) ..

Der folgende Code wird zwei Dreiecke zeichnen .. so:

enter image description here

Jedes Dreieck mit 1 Zeichenaufruf pro Dreieck wiedergegeben wird:

void onDisplayRefreshSO(void* ctx) 
{ 
    //Setup OpenGL once.. 
    static std::once_flag flag; 
    std::call_once(flag, []{ 
     GLfloat view_port[4] = {0}; 
     glGetFloatv(GL_VIEWPORT, &view_port[0]); 
     GLfloat screen_width = view_port[2] - view_port[0]; 
     GLfloat screen_height = view_port[3] - view_port[1]; 

     glMatrixMode(GL_PROJECTION); 
     gluPerspective(45.0, screen_width/screen_height, 0.1f, 1000.0f); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
     glClearDepth(1.0f);         // Depth Buffer Setup 
     glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
     glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 
    }); 



    /** Setup Drawing Triangles **/ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 


    GLfloat normals[] = { 
     0, 0, 1, 0, 0, 1, 0, 0, 1, 
     0, 0, 1, 0, 0, 1, 0, 0, 1 
    }; 

    GLfloat colors[] = { 
     1, 1, 1, 1, 1, 0, 1, 0, 0, 
     0, 1, 1, 0, 1, 0, 0, 0, 1 
    }; 

    GLfloat vertices[] = { 
     1, 1, 1, -1, 1, 1, -1,-1, 1, 
     1, 1, 1, 1, -1, 1, -1,-1, 1 
    }; 



    //9 floats per triangle.. 3 * (X, Y, Z).. 
    for (int i = 0; i < sizeof(vertices)/sizeof(vertices[0])/9; ++i) 
    { 
     glEnableClientState(GL_NORMAL_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 
     glNormalPointer(GL_FLOAT, 0, normals + (i * 9)); 
     glColorPointer(3, GL_FLOAT, 0, colors + (i * 9)); 
     glVertexPointer(3, GL_FLOAT, 0, vertices + (i * 9)); 

     glPushMatrix(); 
     glTranslatef(-1.0f, 0.0f, -6.0f); 
     glDrawArrays(GL_TRIANGLES, 0, 3); //3 vertices (X, Y, Z) per triangle.. 
     glPopMatrix(); 

     glDisableClientState(GL_VERTEX_ARRAY); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_NORMAL_ARRAY); 
    } 
} 

alle in einem einzigen Zeichenaufruf gemacht Dreiecke:

void onDisplayRefreshSO2(void* ctx) 
{ 
    //Setup OpenGL once.. 
    static std::once_flag flag; 
    std::call_once(flag, []{ 
     GLfloat view_port[4] = {0}; 
     glGetFloatv(GL_VIEWPORT, &view_port[0]); 
     GLfloat screen_width = view_port[2] - view_port[0]; 
     GLfloat screen_height = view_port[3] - view_port[1]; 

     glMatrixMode(GL_PROJECTION); 
     gluPerspective(45.0, screen_width/screen_height, 0.1f, 1000.0f); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glShadeModel(GL_SMOOTH);       // Enable Smooth Shading 
     glClearDepth(1.0f);         // Depth Buffer Setup 
     glEnable(GL_DEPTH_TEST);       // Enables Depth Testing 
     glDepthFunc(GL_LEQUAL);        // The Type Of Depth Testing To Do 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 
    }); 


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 


    /** Setup Drawing Triangles **/ 
    GLfloat normals[] = { 
     0, 0, 1, 0, 0, 1, 0, 0, 1, 
     0, 0, 1, 0, 0, 1, 0, 0, 1 
    }; 

    GLfloat colors[] = { 
     1, 1, 1, 1, 1, 0, 1, 0, 0, 
     0, 1, 1, 0, 1, 0, 0, 0, 1 
    }; 

    GLfloat vertices[] = { 
     1, 1, 1, -1, 1, 1, -1,-1, 1, 
     1, 1, 1, 1, -1, 1, -1,-1, 1 
    }; 


    //Draw both triangles in a single call.. 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glNormalPointer(GL_FLOAT, 0, normals); 
    glColorPointer(3, GL_FLOAT, 0, colors); 
    glVertexPointer(3, GL_FLOAT, 0, vertices); 

    glPushMatrix(); 
    glTranslatef(-1.0f, 0.0f, -6.0f); 
    glDrawArrays(GL_TRIANGLES, 0, (sizeof(vertices)/sizeof(vertices[0]))/3); //6 vertices (X, Y, Z) for 2 triangles.. 
    glPopMatrix(); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
} 
Verwandte Themen