Выбор текстур в открытом GL - PullRequest
0 голосов
/ 22 марта 2011

Привет, парни и девушки, у меня проблема в том, что я успешно загрузил 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 ]

4 голосов
/ 22 марта 2011

OpenGL - это конечный автомат .Текущая текстура является частью состояния 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 " имеет главу на текстурное наложение, которое охватывает основы.

1 голос
/ 22 марта 2011

Ваша ошибка заключается в том, что вы не понимаете 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...