2016-08-26 5 views
0

Ich bin auf der Suche nach einigen Erläuterungen und einige Hinweise in Bezug auf die Duplizierung Indizes, die bereits in einem Array.Ich muss aus, was ich sammeln doppelte Indizes, so dass ich einen Würfel (jede Seite eine andere Farbe). Mein Cube wird aus einer "OBJ" -Datei eingelesen.OpenGL Duplizieren Vertex Arrays

aktuellen Code

using std::vector; 

vector<GLfloat>vertex; 
vector<GLuint>faces; 

GLubyte color1[] = 
{ 
    255,255,0, 
    255,255,0, 
    255,255,0, 
    255,255,0, 

    255,0,255, 
    255,0,255, 
    255,0,255, 
    255,0,255 

}; 

struct OBJVertex 
{ 
    GLint f1; 
    GLint f2; 
    GLint f3; 

    GLfloat x; 
    GLfloat y; 
    GLfloat z; 

}obj; 

int OBJLoader::LoadOBJData(string filename) 
{ 
    ifstream f_obj; 

    string line; 

    f_obj.open(filename, ios::in); 

while (!f_obj.eof()) 
{ 
    getline(f_obj, line); 

    if (line.find("v") != line.npos) 
    { 
     sscanf_s(line.c_str(), "v %f %f %f ", &obj.x, &obj.y, &obj.z); 
     vertex.push_back(obj.x); 
     vertex.push_back(obj.y); 
     vertex.push_back(obj.z); 
    } 
    if (line.find("f ")!= line.npos) 
    { 
     sscanf_s(line.c_str(), "f %d %d %d ", &obj.f1, &obj.f2, &obj.f3); 
     obj.f1 = obj.f1 - 1; 
     obj.f2 = obj.f2 - 1; 
     obj.f3 = obj.f3 - 1; 

     faces.push_back(obj.f1); 
     faces.push_back(obj.f2); 
     faces.push_back(obj.f3); 
    } 
} 
return 0; 
} 
void OBJLoader::RenderOBJ() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1); 
    glVertexPointer(3,GL_FLOAT, 0, &vertex[0]); 

    glDrawElements(GL_TRIANGLE_STRIP,faces.size(),GL_UNSIGNED_INT,&faces[0]); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_COLOR_ARRAY); 
} 

Bin ich denken korrigieren in Ich brauche sowohl den Scheitelpunkt und Farbarray zu binden glBindBuffer verwenden?

glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 

Im Moment habe ich ein Setup-Farb Array mit dem Namen „color1“, diese Farben die oberen und unteren Flächen des Würfels nach den ersten Eckpunkt und Farbarray Bindung bin ich in Gedanken korrigieren kann ich zwei weitere Farb Arrays erstellen für die restlichen Seiten des Würfels?

Idee?

glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1); // first colour array // 
glVertexPointer(3,GL_FLOAT, 0, &vertex[0]); 

glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT,&faces[0]); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 



glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glColorPointer(3, GL_UNSIGNED_BYTE, 0, color2); // second colour array // 
glVertexPointer(3,GL_FLOAT, 0, &vertex[0]); 

glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT,&faces[0]); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 

---- ---- aktualisieren

Sorry, aber ich habe eine Farb Array pro Gesicht, aber es ist nur das Überschreiben der vorherigen array.Can jemand erklären, was ich nicht richtig gemacht?

GLubyte color1[] = 
{ 
    255,255,0, 
    255,255,0, 
    255,255,0, 
    255,255,0, 

    255,0,255, 
    255,0,255, 
    255,0,255, 
    255,0,255 

    }; 

GLubyte color2[] = 
{ 
    255,0,0, 
    255,0,0, 
    255,0,0, 
    255,0,0, 

    0,0,255, 
    0,0,255, 
    0,0,255, 
    0,0,255 
}; 

GLubyte color3[] = 
{ 
    0,255,255, 
    0,255,255, 
    0,255,255, 
    0,255,255, 

    255,0,255, 
    255,0,255, 
    255,0,255, 
    255,0,255 
}; 

GLubyte color4[] = 
{ 
    255,255,255, 
    255,255,255, 
    255,255,255, 
    255,255,255, 

    0,255,0, 
    0,255,0, 
    0,255,0, 
    0,255,0 
}; 

void OBJLoader::RenderOBJ() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, &vertex[0]); 

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1); 
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color2); 
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color3); 
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color4); 

    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]); 
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]); 
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]); 
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]); 

    glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 

---- ---- OBJ

v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -1.000000 
v 1.000000 1.000000 1.000000 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
f 5 1 4 
f 5 4 8 
f 3 7 8 
f 3 8 4 
f 2 6 3 
f 6 7 3 
f 1 5 2 
f 5 6 2 
f 5 8 6 
f 8 7 6 
f 1 2 3 
f 1 3 4 

Antwort

0

In Ihrem Fall müssen Sie nicht einen Puffer überhaupt binden, da Sie den Index Ihrer Puffer direkt in glColorPointer() senden.

Stellen Sie sich vor, Sie senden einen Zeiger auf Ihren Puffer direkt an OpenGL, von dem gelesen werden soll. Sie können mehr Farbpuffer erstellen und einfach Ihre glColorPointer() ändern.

Alternativ können Sie alle Farben in einem Puffer als Farbe und einfach den richtigen Offset übergeben. Angenommen, Sie hatten 72 Komponenten für drei Farben in einem einzigen Puffer, den Sie tun können.

glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[0]); 
//... 
glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[24]); 
//... 
glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[48]); 

Sie brauchen nur Puffer zu binden, wenn Sie einen Null-Zeiger wie diese

//setup your array buffer 
GLuint colorBuffID; 
glGenBuffers(1, &colorBuffID); 
glBindBuffer(GL_ARRAY_BUFFER, colorBuffID); 
glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(unsigned char), color1, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
//... 
//use your array buffer 
glBindBuffer(GL_ARRAY_BUFFER, colorBuffID); 
glColorPointer(3, GL_UNSIGNED_BYTE, 0, (const void*)(0)); 
// draw the quad 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
passieren

Wenn ein Nicht-Null-Namen Puffer-Objekt an das Ziel GL_ARRAY_BUFFER gebunden ist (siehe glBindBuffer), während Ein Farbfeld wird angegeben. Der Zeiger wird als Byte-Offset in den Datenspeicher des Pufferobjekts behandelt. Außerdem wird die Bindung des Pufferobjekts (GL_ARRAY_BUFFER_BINDING) als Farbe Client-seitiger Vertex-Array-Status (GL_COLOR_ARRAY_BUFFER_BINDING) gespeichert.

Siehe https://www.opengl.org/sdk/docs/man2/xhtml/glColorPointer.xml

+0

Vielen Dank für Ihre Antwort. – AlasdairRyan

+0

Ich habe versucht, ein Farbfeld pro Gesicht zu beeinträchtigen, aber es überschreibt das vorherige Array. Was habe ich falsch gemacht (siehe aktualisierten Abschnitt)? – AlasdairRyan

+0

Sie müssen den Farbzeiger einstellen, dann zeichnen, dann den nächsten setzen und dann zeichnen. Der Farbzeiger hat immer Ihr letztes Array gemäß Ihrem Code. Folgen Sie Set-Array 1 dann zeichnen, dann Array 2 und zeichnen und so weiter. – Harish

Verwandte Themen