在开放GL中选择纹理

时间:2011-03-22 14:13:45

标签: opengl textures

嗨,大家好,我的问题是我已经成功加载了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无论如何我可以选择其中一个吗?

2 个答案:

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