c++ - glvertexpointer std::vector, struct memory opengl -
i use struct
struct vertex { float pos[3]; float tex[2] = {0, 0}; float norm[3] = {0, 0, 0}; int index_mtl; };
i use vector
std::vector<vertex> verts;
how use "glvertexpointer" struct vector.
i wanted drawing function. in end did not succeed.
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); }
if use struct
vertices no longer tightly packed , need specify stride:
glenableclientstate( gl_vertex_array ); glvertexpointer( 3, gl_float, sizeof( vertex ), &verts[0].pos ); gldrawarrays( gl_triangles, 0, 3 ); gldisableclientstate(gl_vertex_array);
like so:
#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; }
Comments
Post a Comment