【发布时间】:2016-08-28 11:07:47
【问题描述】:
我正在寻找一些关于复制已经存在于数组中的索引的说明和指导。我需要从我收集的重复索引中提取,以便我可以渲染一个立方体(每一面都有不同的颜色)。 我的立方体是从“OBJ”文件中读入的。
当前代码
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);
}
我认为我需要使用 glBindBuffer 绑定顶点和颜色数组是否正确?
glBindBuffer(GL_ARRAY_BUFFER,vertex[0]);
我目前有一个名为“color1”的颜色数组设置,这会在绑定第一个顶点和颜色数组后为立方体的顶面和底面着色,我是否正确地认为我可以为剩余边创建两个颜色数组立方体?
想法?
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]);
----更新----
抱歉,我为每个面创建了一个颜色数组,但它只是覆盖了之前的数组。有人可以解释一下我做错了什么吗?
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
【问题讨论】: