嗨,大家好,我的问题是我已经成功加载了3个BMP纹理(或者至少我希望我使用char* textureFilenames[textureCount] = {"cement.bmp","hedge.bmp","sky.bmp"};
我正在使用
glTexCoord2f(0.0,0.0);
glVertex3f(-150.0, 0.0, -150.0);
glTexCoord2f(1.0,0.0);
glVertex3f(-150.0, 0.0, 150.0);
glTexCoord2f(1.0,1.0);
glVertex3f(150.0, 0.0, 150.0);
glTexCoord2f(0.0,1.0);
glVertex3f(150.0, 0.0, -150.0);
然而它目前只能拿起sky.bmp无论如何我可以选择其中一个吗?
答案 0 :(得分:4)
OpenGL是state machine。当前纹理是OpenGL状态的一部分。在绑定另一个纹理之前,将使用与glBindTexture()绑定的最后一个纹理。
glBindTexture(GL_TEXTURE_2D, cement_texture_id);
// ... following geometry will use the cement texture
glBindTexture(GL_TEXTURE_2D, hedge_texture_id);
// ... hedge texture
glBindTexture(GL_TEXTURE_2D, sky_texture_id);
// ... sky texture
“OpenGL RedBook”在纹理映射上有a chapter,涵盖了基础知识。
答案 1 :(得分:1)
你错误地认为你缺乏对OpenGL的理解。 OpenGL不是场景图!最好将OpenGL视为一组绘图工具,在一个称为帧缓冲区的画布上绘制。
因此,在使用OpenGL时,如果您使用铅笔,橡皮擦,画笔和颜料绘制图片,则必须将您的思维置于类似的状态。首先你准备你的工具:纹理就像“颜色板”,顶点的网格就像一些精致的“刷子”。
像艺术家一样,第一步是准备你的工具。您准备几何体(即网格),如果使用顶点缓冲区对象,则使用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();
}