【发布时间】:2018-05-17 03:11:50
【问题描述】:
我需要使用 VBO 通过加载波前对象来绘制立方体。 通过绘制三角形。 这是对象:
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
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
f 2//1 3//1 1//1
f 4//2 7//2 3//2
f 8//3 5//3 7//3
f 6//4 1//4 5//4
f 7//5 1//5 3//5
f 4//6 6//6 8//6
f 2//1 4//1 3//1
f 4//2 8//2 7//2
f 8//3 6//3 5//3
f 6//4 2//4 1//4
f 7//5 5//5 1//5
f 4//6 2//6 6//6
我还有一个自己填充的冷却器数组,它等于人脸数量的 3 倍,即 36 个索引
float colours[] = {
0.583f, 0.771f, 0.014f,
0.609f, 0.115f, 0.436f,
0.327f, 0.483f, 0.844f,
0.822f, 0.569f, 0.201f,
0.435f, 0.602f, 0.223f,
0.310f, 0.747f, 0.185f,
0.597f, 0.770f, 0.761f,
0.559f, 0.436f, 0.730f,
0.359f, 0.583f, 0.152f,
0.483f, 0.596f, 0.789f,
0.559f, 0.861f, 0.639f,
0.195f, 0.548f, 0.859f,
}
我将顶点、法线、颜色信息存储到绑定到 VBO 缓冲区的数组中:
float* vbo = new float[78]
按照顶点|法线|颜色的顺序是24indices|18indices|36indices,我已经测试它工作得很好
我使用另一个数组来存储顶点索引信息,它是 36 个索引,例如:f 2//1 3//1 1//1 我在我的数组中存储为 2/3/1
int *element = new int[36];
我已经测试它运行良好,我初始化我的vbo如下:
static void init(void){
.......
Gluint vbo_id,index_id;
glGenBuffers(1,&vbo_id);
glGenBuffers(1,&index_id);
glBindBuffer(GL_ARRAY_BUFFER,vbo_id);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,index_id);
glBufferData(GL_ARRAY_BUFFER,sizeof(vbo),vbo,GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(element),element,GL_STATIC_DRAW); }
我的画在这里
static void display(void){
.......
glBindBuffer(GL_ARRAY_BUFFER,vbo_id);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,index_id);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3,GL_FLOAT,0,0);
glNormalPointer(GL_FLOAT,0,(void*)(24*sizeof(float)));//binding
glColorPointer(3,GL_FLOAT,0,(void*)(42*sizeof(float)));
for(int i=0;i<12;i++){
glBegin(GL_TRIANGLES);
glArrayElement(element[i]);
glArrayElement(element[i+1]);
glArrayElement(element[i+2]);
glEnd();
}
/* have try this one too:
glDrawElements(GL_TRIANGLES,3,GL_INT,0) */
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
}
但是屏幕上没有任何显示。我的绑定方法是否正确,当我使用索引绘制时,我的老师告诉我,如果我绑定顶点和法线,并且颜色正确,它将通过使用顶点索引绘制自动匹配。
【问题讨论】: