2011-03-22 87 views
0

嗨,大家好和女孩我的问题是我已经成功加载3个BMP纹理(或至少我希望我已经使用char* textureFilenames[textureCount] = {"cement.bmp","hedge.bmp","sky.bmp"}; 和我目前使用开放GL选择纹理

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反正有我可以选择其他的吗?

+3

是否有任何理由,为什么您创建一个新用户#1对每个问题?我的意思是,你的问题包含http://stackoverflow.com/q/5388799/524368和http://stackoverflow.com/q/5384206/524368中的一小段代码 - 你显然是同一个人。 – datenwolf 2011-03-22 14:48:06

+0

[opengl纹理]可能的重复(http://stackoverflow.com/questions/5380717/opengl-texturing) – genpfault 2011-03-22 15:13:53

+0

在我回答之前没有注意到所有的模糊:/ – luke 2011-03-22 15:29:28

回答

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在纹理映射上覆盖了基础知识。

+0

根据其余模型中的代码判断,在GLuint theTexture [textureCount]中有一组纹理id, – luke 2011-03-22 16:00:32

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(); 
}