Я новичок в OpenGL, и у меня возникла любопытная проблема с моими текстурами - я ищу толчок в правильном направлении.
У меня есть приложение, которое использует технику Render to texture для достижения определенного эффекта - оно работает великолепно. Я рисую в внеэкранный буфер каждый раз, когда мне это нужно, и могу использовать это в качестве текстуры в цикле рендеринга.
Эта текстура обновляется только при необходимости - она отображается на экране, как и большинство кадров.
У меня есть несколько панелей инструментов, которые также нарисованы с использованием OpenGL, поверх этой поверхности, с использованием текстурного атласа и смешивания.
Я недавно начал пытаться внедрить систему частиц в приложение, но всякий раз, когда я пытаюсь визуализировать графику системы частиц, я «теряю» свою текстуру, которую я рендерил на первом шаге - т.е. ее содержимое исчезает.
Я проследил это до вызова glBindTexture, который связывает текстуру частиц.
РЕДАКТИРОВАТЬ: Я могу воспроизвести это в моей простой программе рисования панели инструментов, код ниже. Это грубая процедура, которая анимирует графику панели инструментов на экране и за его пределами.
Когда я раскомментирую первые две строки в drawToolBar (), моя текстура рендеринга в памяти исчезает, то есть вызов drawarrays в моем цикле рендеринга ничего не отображает на экране. В ходе тестирования я определил, что вызов glBidTexture вызывает это. (Например, я могу рендерить цветные квадраты поверх моей текстуры, но не текстурированные)
Однако все нормально, если я позволю drawToolbar () работать так, как показано ниже - единственное отличие состоит в том, что возможный вызов drawTools () обернут в glPush / Pop и переведен.
Обратите внимание, что рендеринг панели инструментов всегда работает - здесь происходят непредвиденные побочные эффекты, последствия или ошибки, из-за которых моя фоновая текстура исчезает.
Любые идеи приветствуются - это сводит меня с ума.
Код:
void drawTools()
{
//*Texture Coordinate Stuff Snipped*//
glBindTexture(GL_TEXTURE_2D, _buttontexture);
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer (2, GL_FLOAT, 0,bottomToolQuads);
glTexCoordPointer(2, GL_FLOAT, 0,texc);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);
glDisable(GL_TEXTURE_2D);
}
void drawToolBar()
{
//drawTools();
//return;
if(_toolbarState ==0)
{
drawTools();
}
else if(_toolbarState == 2)//hiding
{
_toolbarVisiblePct -= TOOLINC;
if(_toolbarVisiblePct <= 0.0)
{
_toolbarState = 1;
_toolbarVisiblePct = 0.0;
}
else
{
glPushMatrix();
glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0);
drawTools();
glPopMatrix();
}
}
else if(_toolbarState == 3) //showing
{
_toolbarVisiblePct += TOOLINC;
if(_toolbarVisiblePct >= 1.0)
{
_toolbarState = 0;
_toolbarVisiblePct = 1.0;
drawTools();
}
else
{
glPushMatrix();
glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0);
drawTools();
glPopMatrix();
}
}
}