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
Vielen Dank für Ihre Antwort. – AlasdairRyan
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
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