Can';t使OpenGL缓冲区数组工作-glVertex工作

Can';t使OpenGL缓冲区数组工作-glVertex工作,opengl,Opengl,我有一个特征::矩阵xxf,其中顶点(N*3)和面(N*3)作为变量mvTemp2和mF 如果我定期绘制顶点,它们将根据以下代码提供正确的输出: while(1){ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable(GL_LIGHTING); glShadeModel( GL_SMOOTH ); glEnable( GL_TEXTURE_2D ); glViewport( 0,

我有一个特征::矩阵xxf,其中顶点(N*3)和面(N*3)作为变量mvTemp2和mF

如果我定期绘制顶点,它们将根据以下代码提供正确的输出:

while(1){
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glEnable(GL_LIGHTING);
    glShadeModel( GL_SMOOTH );
    glEnable( GL_TEXTURE_2D );

    glViewport( 0, 0, (float)renderWidth/1, (float)renderHeight/1. );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 60, (float)renderWidth/(float)renderHeight, 0.1, 10000. );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
    glPushMatrix();
    glTranslatef(0,-0.5,-0.5);
//        glBindVertexArray(vao);
//        glDrawElements(GL_TRIANGLES, indexdata.size(), GL_UNSIGNED_BYTE,     (void*)0);

    for(int i=0; i<smpl.mF.rows(); i++){
        glBegin(GL_POLYGON);
        for(int j=0; j<smpl.mF.cols(); j++){
            indexdata.push_back(smpl.mF(i,j)+1);

        }
        glVertex3fv((const GLfloat*)&vertexdata[smpl.mF(i,0)].position);
        glVertex3fv((const GLfloat*)&vertexdata[smpl.mF(i,1)].position);
        glVertex3fv((const GLfloat*)&vertexdata[smpl.mF(i,2)].position);
        glEnd();
    }

    glPopMatrix();

    glutSwapBuffers();
    glutPostRedisplay();
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    glutMainLoopEvent();
}
while(1){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glEnable(德国劳埃德大学照明);
glShadeModel(GL_平滑);
glEnable(GL_纹理_2D);
glViewport(0,0,(浮动)渲染宽度/1,(浮动)渲染光线/1.);
glMatrixMode(GL_投影);
glLoadIdentity();
gluPerspective(60,(浮动)渲染宽度/(浮动)渲染高度,0.11000);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glPolygonMode(GLU前、后、GLU线);
glPushMatrix();
glTranslatef(0,-0.5,-0.5);
//glBindVertexArray(vao);
//GLD元素(GL_三角形,indexdata.size(),GL_无符号字节,(void*)0);

对于(int i=0;i您未使用着色器进行顶点处理。因此,不能使用常规顶点属性(由
VertexAttrib
函数提供)。因此,您可以切换到使用着色器,或使用固定函数属性:

// set up vertex attributes
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, position)); // vertices
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, normal)); // normals
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, texcoord)); // normals

您没有使用着色器进行顶点处理。因此,不能使用常规顶点属性(由
VertexAttrib
函数提供)。因此,您可以切换到使用着色器,或使用固定函数属性:

// set up vertex attributes
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, position)); // vertices
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, normal)); // normals
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, texcoord)); // normals

除了Nicol Bolas的回答之外:

看起来索引的数量太多,无法用字节进行编码(
GLubyte
)。一个字节可以存储[0255]范围内的数据,因此一个字节只能编码256个索引。请改用
GLushort
GLushort
的范围为[065535]:

std::vector<GLushort> indexdata;

....

GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexdata.size()*sizeof(GLushort),
    indexdata.data(), GL_STATIC_DRAW);

....

glDrawElements(GL_TRIANGLES, indexdata.size(), GL_UNSIGNED_SHORT, (void*)0);
std::向量索引数据;
....
GLuint-ibuffer;
glGenBuffers(1,&ibuffer);
glBindBuffer(GL_元素_数组_缓冲区,ibuffer);
glBufferData(GL_元素\u数组\u缓冲区,indexdata.size()*sizeof(GLushort),
indexdata.data(),GL_STATIC_DRAW);
....
glpaurements(GL_三角形,indexdata.size(),GL_无符号_短,(void*)0);

除了Nicol Bolas的回答之外:

看起来索引的数量太多,无法用字节进行编码(
GLubyte
)。一个字节可以存储[0255]范围内的数据,因此一个字节只能编码256个索引。请改用
GLushort
GLushort
的范围为[065535]:

std::vector<GLushort> indexdata;

....

GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexdata.size()*sizeof(GLushort),
    indexdata.data(), GL_STATIC_DRAW);

....

glDrawElements(GL_TRIANGLES, indexdata.size(), GL_UNSIGNED_SHORT, (void*)0);
std::向量索引数据;
....
GLuint-ibuffer;
glGenBuffers(1,&ibuffer);
glBindBuffer(GL_元素_数组_缓冲区,ibuffer);
glBufferData(GL_元素\u数组\u缓冲区,indexdata.size()*sizeof(GLushort),
indexdata.data(),GL_STATIC_DRAW);
....
glpaurements(GL_三角形,indexdata.size(),GL_无符号_短,(void*)0);

我用它替换了VertexAttrib,我仍然得到了相同的结果我用它替换了VertexAttrib,我仍然得到了相同的结果W现在可以工作了,非常感谢。这很奇怪,因为我尝试了胶合,但不起作用不幸的是,我的法线似乎不正确。当我正常绘制网格时,网格是黑色的。我做错了什么吗?我已编辑代码以推入法线too@raaj法线向量是否已规格化?可能将规格化设置为
GL_TRUE
不起作用,这是您所期望的。请参阅我已编辑了我的问题,以包括我更改的代码。您能否帮助我查看that@raaj当然,你必须考虑Nicol Bolas too.wow THA的答案。t现在可以工作了,非常感谢。这很奇怪,因为我尝试了GLUint,但不起作用。不幸的是,我的法线似乎不正确。当我正常绘制网格时,网格是黑色的。我做错了什么吗?我编辑了代码以推入法线too@raaj法线向量是否已规格化?可能将规格化设置为
GL\u TRUE
不起作用,你期望它做什么。看,我已经编辑了我的问题,包括我更改的代码。你能帮我看一下吗that@raaj当然,你也要考虑Nicol Bolas的答案。
std::vector<GLushort> indexdata;

....

GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexdata.size()*sizeof(GLushort),
    indexdata.data(), GL_STATIC_DRAW);

....

glDrawElements(GL_TRIANGLES, indexdata.size(), GL_UNSIGNED_SHORT, (void*)0);