Ваша ошибка заключается в том, что вы не понимаете OpenGL. OpenGL - это не граф сцены! Лучше всего думать, что OpenGL - это набор инструментов для рисования на холсте, называемом буфером кадров.
Так что при использовании OpenGL вы должны сосредоточитьсяв таком же состоянии, как если бы вы рисовали картинку карандашами, ластиком, кистью и краской.Сначала вы готовите свои инструменты: текстуры похожи на «цветные листы», сетки вершин похожи на какую-то тонкую «кисть».
Как художник, первый шаг в том, чтобы подготовить ваши инструменты.Вы готовите свою геометрию (то есть сетки), если вы используете объекты Vertex Buffer, вы загружаете их в быструю память с помощью glBufferData, а ваши краски и краски - текстуры.Это то, что вы делаете в фазе «инициализации» (я предпочитаю делать это по требованию, чтобы пользователи не видели экран «загрузки»).
Сначала вы загружаете все свои объекты (геометрия в VBO), текстуры и т. д.);вы делаете это ровно один раз для каждого требуемого объекта, то есть после того, как объект подготовлен (т.е. завершен), вам не нужно повторно загружать его.
Затем в каждой итерации рисования для каждого объекта, который вы хотите нарисоватьпривяжите необходимые объекты OpenGL к их целям , затем выполните вызовы рисования, которые затем будут выполняться с использованием связанных в данный момент объектов.
то есть что-то вроде этого, пожалуйстаиспользуйте здравый смысл, чтобы восполнить недостающие функции в вашем уме:
struct texture; // some structure holding texture information, details don't matter here
struct geometry; // structure holding object geometry and cross references
texture *textures;
geometry *geometries;
texture * load_texture(char const *texture_name)
{
texture *tex;
if( texture_already_loaded(textures, texture_name) )
tex = get_texture(texture_name);
else
tex = load_texture_data(textures, texture_name);
return tex;
}
geometry * load_geometry(char const *geometry_name)
{
geometry * geom;
if( geometry_already_loaded(geometries, geometry_name) )
geom = get_geometry(geometry_name);
else
geom = load_geometry_data(geometries, geometry_name)
if( geom->texture_name )
geom->texture = load_texture(geom->texture_name);
return geom;
}
void onetime_initialization()
{
for(geometry_list_entry * geom = geometry_name_list; geom ; geom = geom->next)
geom->geometry = geometry_load(geom->name);
}
void drawGL()
{
glViewport(...);
glClearColor(...);
glClear(...);
glMatrixMode(GL_PROJECTION);
// ...
glMatrixMode(GL_MODELVIEW);
// ...
for(geometry_list_entry * geom = geometry_name_list; geom ; geom = geom->next)
{
glMatrixMode(GL_MODELVIEW); // this is not redundant!
glPushMatrix();
apply_geometry_transformation(geom->transformation); // calls the proper glTranslate, glRotate, glLoadMatrix, glMultMatrix, etc.
glBindTexture(GL_TEXTURE_2D, geom->texture->ID);
draw_geometry(geom);
glMatrixMode(GL_MODELVIEW); // this is not redundant!
glPopMatrix();
}
// ...
swapBuffers();
}