Переключение между текстурами, загруженными с SOIL

Я пытаюсь загрузить две текстуры, а затем переключаться между ними в моей функции отображения. Я использую библиотеку SOIL для загрузки текстур как таковых:

tex_2 = SOIL_load_OGL_texture
    (
            "s9.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

tex_1 = SOIL_load_OGL_texture
    (
            "s8.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

А потом пользуюсь

glBindTexture(GL_TEXTURE_2D, tex_1) 
or
glBindTexture(GL_TEXTURE_2D, tex_2);

Для переключения между двумя. Проблема в том, что я должен загружать их неправильно, и я не уверен, как. Какая бы текстура не загружалась последней (tex_1 в приведенном выше коде), это текстура, которую я получаю для tex_1 и tex_2, когда пытаюсь переключиться с помощью glBindTexture. Есть идеи?

Перед загрузкой teachtures я настроил смешивание и включил текстуру и спрайты

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

Затем в своей функции отображения я зацикливаю все свои точки, которые хочу нарисовать, и пытаюсь изменить текущую текстуру, прежде чем рисовать точку с помощью glVertex3f:

for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

Цель состоит в том, чтобы у меня было два типа точек, и спрайт, который нужно нарисовать в каждой точке, зависит от класса, в котором находится точка

2 ответа

Решение
for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

Ты не можешь позвонить glBindTexture() внутри glBegin()/glEnd() пара:

GL_INVALID_OPERATION генерируется, если glBindTexture выполняется между исполнением glBegin и соответствующее исполнение glEnd,

Последний успешный glBindTexture() был, вероятно, в самом последнем SOIL_load_OGL_texture() вызов. Вот почему tex_1 а также tex_2 кажется, содержат те же данные текстуры: tex_2 никогда не отскок.

Как и предыдущие ответы: вы не можете менять текстуры между glBegin/glEnd.

Что вы можете сделать тогда?

  • сортируйте ваши частицы по материалу... в данном случае по вашей текстуре. Установите первую текстуру, нарисуйте частицы (glBegin/glEnd), затем установите вторую текстуру и нарисуйте оставшиеся частицы.
  • использовать текстурные атласы - http://en.wikipedia.org/wiki/Texture_atlas. Вот более продвинутое использование: http://www.popcornfx.com/wiki/index.php/Particle_tutorial_smoke
    • Таким образом, у вас будет одна текстура, но вам нужно будет установить различные координаты текстуры...
Другие вопросы по тегам