Переключение между текстурами, загруженными с 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
- Таким образом, у вас будет одна текстура, но вам нужно будет установить различные координаты текстуры...