Проблема glBindTexture с OpenGL ES на iPhone - PullRequest
2 голосов
/ 19 марта 2010

Я новичок в 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();

    }
}   

}

1 Ответ

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

Похоже, вы отключили рендеринг текстур в конце метода drawTools. OpenGL - это конечный автомат, если вы отключите состояние, оно останется отключенным, пока вы не включите его снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...