2013-04-17 5 views
2

Я пытаюсь загрузить две текстуры, а затем переключиться между ними в моей функции отображения. Я использую библиотеку ПОЧВЫ для загрузки текстур, как например:Переключение между текстурами, загруженными 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. Есть идеи?

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

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

Тогда в моей функции отображения, I цикл по всем моим пунктам, которые я хочу сделать, и попытаться изменить текущую текстуру перед тем рисование точки с 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]); 
} 

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

+1

Вы должны разместить больше кода, так что мы можем на самом деле увидеть, что ваша проблема. –

ответ

3
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 никогда не восстанавливается.

1

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

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

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

Текстуры текстуры довольно сложны с помощью спрайтов с фиксированной функцией :( – genpfault

 Смежные вопросы

  • Нет связанных вопросов^_^