glvertexpointer std::vector,结构内存 opengl

Posted

技术标签:

【中文标题】glvertexpointer std::vector,结构内存 opengl【英文标题】:glvertexpointer std::vector, struct memory opengl 【发布时间】:2013-07-17 14:48:57 【问题描述】:

我使用结构

struct Vertex

  float pos[3];
  float tex[2]  = 0, 0;
  float norm[3] = 0, 0, 0;
  int index_mtl;
;

我使用矢量

std::vector<Vertex> verts;

如何为我的结构向量使用“glvertexpointer”。

我想用那个功能画画。最后我没有成功。

void Obj_render::DrawObject()

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, verts.data()->pos);

    glDrawArrays(GL_TRIANGLES,0,3);
    // deactivate vertex arrays after drawing
    glDisableClientState(GL_VERTEX_ARRAY);


【问题讨论】:

那些 struct 成员初始化器是 C99/C++11 的特性吗? VS2010 似乎让他们窒息。 【参考方案1】:

如果您使用struct 这样您的顶点不再紧密排列,您需要指定步幅:

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, sizeof( Vertex ), &verts[0].pos );
glDrawArrays( GL_TRIANGLES, 0, 3 );
glDisableClientState(GL_VERTEX_ARRAY);

像这样:

#include <GL/glut.h>
#include <vector>

struct Vertex

    float pos[3];
    float tex[2];
    float norm[3];
    int index_mtl;
;

std::vector< Vertex > verts;
void display()

    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( -2, 2, -2, 2, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3ub( 255, 0, 0 );

    glEnableClientState( GL_VERTEX_ARRAY );
    glVertexPointer( 3, GL_FLOAT, sizeof( Vertex ), &verts[0].pos );
    glDrawArrays( GL_TRIANGLES, 0, 3 );
    glDisableClientState(GL_VERTEX_ARRAY);

    glutSwapBuffers();


int main( int argc, char **argv )

    Vertex tmp;
    tmp.pos[0] = 0;
    tmp.pos[1] = 0;
    tmp.pos[2] = 0;
    verts.push_back( tmp );
    tmp.pos[0] = 1;
    tmp.pos[1] = 0;
    tmp.pos[2] = 0;
    verts.push_back( tmp );
    tmp.pos[0] = 1;
    tmp.pos[1] = 1;
    tmp.pos[2] = 0;
    verts.push_back( tmp );

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;

【讨论】:

以上是关于glvertexpointer std::vector,结构内存 opengl的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glDrawArrays 和 glVertexPointer?

openGL之API学习(一八八)glVertexAttribPointer和glVertexPointer

NDK OpenGL 未定义对 glVertexPointer 的引用

openGL之API学习(一六九)glVertexPointer

如何将 std::accumulate 用于矩阵

Pyglet VBOs glVertexPointer