OpenGL:尝试使用 VBO(顶点缓冲对象)绘制线条,它不显示
OpenGL: try to draw lines using VBO(vertex buffer object), it doesn't display
我尝试将我的 openGL 代码从使用显示列表切换到使用 VBO。
在代码中,我尝试绘制了一个绿色网格地板,它由平行于x轴的绿色线条和平行于z轴的绿色线条组成。
但是当程序运行时,floor 不显示。而且我找不到哪里出了问题。
这是我的代码初始化楼层的 VBO:
//**********************************
//defined in head of my source code
struct BufferVBO1
{
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat r;
GLfloat g;
GLfloat b;
};
struct IdVBO
{
GLuint id;
size_t bufsiz;
};
IdVBO vboGround;
//**************************************
glGenBuffers(1, &vboGround.id);
int groundSiz1 = ( (floorEdge_x_max-floorEdge_x_min)/(5*LENGTH_UNIT)+1 )*2 ;
int groundSiz2 = ( (floorEdge_z_max-floorEdge_z_min)/(5*LENGTH_UNIT)+1 )*2 ;
vboGround.bufsiz = groundSiz1+groundSiz2 ;
BufferVBO1 *groundBuf = new BufferVBO1 [vboGround.bufsiz];
for(int i=0, idx=0; idx<groundSiz1; ++i)
{
groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_max;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
}
for(int i=0, idx=groundSiz1; idx<vboGround.bufsiz; ++i)
{
groundBuf[idx].x = floorEdge_x_min;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
groundBuf[idx].x = floorEdge_x_max;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
}
glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
glBufferData(GL_ARRAY_BUFFER, sizeof(BufferVBO1)*vboGround.bufsiz, groundBuf, GL_STATIC_DRAW);
delete [] groundBuf ;
glBindBuffer(GL_ARRAY_BUFFER, 0);
这里是要显示的代码:
glDisable(GL_LIGHTING);
glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(BufferVBO1), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer( 3, GL_FLOAT, sizeof(BufferVBO1), (void*)(sizeof(GLfloat)*3) );
for(int i=0; i<vboGround.bufsiz; i+=2)
glDrawArrays(GL_LINE, i, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnable(GL_LIGHTING);
我试过使用 VBO 绘制一个简单的 GL_QUADS 地板,它成功了!但是当我尝试绘制绿色网格地板时,它没有显示。
告诉我哪里出了问题。
此处glDrawArrays()
的第一个参数无效:
glDrawArrays(GL_LINE, i, 2);
GL_LINE
不是有效的基本类型。您需要使用 GL_LINES
:
glDrawArrays(GL_LINES, i, 2);
GL_LINE
可能看起来非常相似,但它是 glPolygonMode()
.
的可能参数之一
当您的 OpenGL 调用未按预期运行时,您应该始终调用 glGetError()
。在这种情况下,它应该返回 GL_INVALID_ENUM
.
顺便说一句,您可以在单个 glDrawArrays()
调用中绘制所有线条,而不是使用循环:
glDrawArrays(GL_LINES, 0, vboGround.bufsize);
我尝试将我的 openGL 代码从使用显示列表切换到使用 VBO。 在代码中,我尝试绘制了一个绿色网格地板,它由平行于x轴的绿色线条和平行于z轴的绿色线条组成。 但是当程序运行时,floor 不显示。而且我找不到哪里出了问题。
这是我的代码初始化楼层的 VBO:
//**********************************
//defined in head of my source code
struct BufferVBO1
{
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat r;
GLfloat g;
GLfloat b;
};
struct IdVBO
{
GLuint id;
size_t bufsiz;
};
IdVBO vboGround;
//**************************************
glGenBuffers(1, &vboGround.id);
int groundSiz1 = ( (floorEdge_x_max-floorEdge_x_min)/(5*LENGTH_UNIT)+1 )*2 ;
int groundSiz2 = ( (floorEdge_z_max-floorEdge_z_min)/(5*LENGTH_UNIT)+1 )*2 ;
vboGround.bufsiz = groundSiz1+groundSiz2 ;
BufferVBO1 *groundBuf = new BufferVBO1 [vboGround.bufsiz];
for(int i=0, idx=0; idx<groundSiz1; ++i)
{
groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
groundBuf[idx].x = floorEdge_x_min+i*5*LENGTH_UNIT;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_max;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
}
for(int i=0, idx=groundSiz1; idx<vboGround.bufsiz; ++i)
{
groundBuf[idx].x = floorEdge_x_min;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
groundBuf[idx].x = floorEdge_x_max;
groundBuf[idx].y = 0;
groundBuf[idx].z = floorEdge_z_min+i*5*LENGTH_UNIT;
groundBuf[idx].r = 75/255.0;
groundBuf[idx].g = 1.0;
groundBuf[idx].b = 63/255.0;
++idx;
}
glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
glBufferData(GL_ARRAY_BUFFER, sizeof(BufferVBO1)*vboGround.bufsiz, groundBuf, GL_STATIC_DRAW);
delete [] groundBuf ;
glBindBuffer(GL_ARRAY_BUFFER, 0);
这里是要显示的代码:
glDisable(GL_LIGHTING);
glBindBuffer(GL_ARRAY_BUFFER, vboGround.id);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(BufferVBO1), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer( 3, GL_FLOAT, sizeof(BufferVBO1), (void*)(sizeof(GLfloat)*3) );
for(int i=0; i<vboGround.bufsiz; i+=2)
glDrawArrays(GL_LINE, i, 2);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnable(GL_LIGHTING);
我试过使用 VBO 绘制一个简单的 GL_QUADS 地板,它成功了!但是当我尝试绘制绿色网格地板时,它没有显示。
告诉我哪里出了问题。
此处glDrawArrays()
的第一个参数无效:
glDrawArrays(GL_LINE, i, 2);
GL_LINE
不是有效的基本类型。您需要使用 GL_LINES
:
glDrawArrays(GL_LINES, i, 2);
GL_LINE
可能看起来非常相似,但它是 glPolygonMode()
.
当您的 OpenGL 调用未按预期运行时,您应该始终调用 glGetError()
。在这种情况下,它应该返回 GL_INVALID_ENUM
.
顺便说一句,您可以在单个 glDrawArrays()
调用中绘制所有线条,而不是使用循环:
glDrawArrays(GL_LINES, 0, vboGround.bufsize);