#iphone #opengl-es
#iPhone #opengl-es
Вопрос:
У меня серьезная проблема с OpenGL ES 1.1, и я не могу найти решение, хотя я просматривал его тысячу раз, и я не нашел здесь ничего похожего на сопоставимую проблему. Я надеюсь, что вы, ребята, сможете мне помочь.
Я смотрел урок 2 на 71squared.com (вы можете найти его здесь) и загрузил пример кода с той же страницы. Он работает нормально.
Затем я попытался написать свой собственный код, чтобы адаптировать его к своему проекту. В любом случае, когда дело доходит до вызовов OpenGL, я обратил внимание на использование того же кода, что и в примере.
Проблема заключается в следующем: мой вызов glClear () влияет на цвет экрана, хотя мои текстуры не отображаются. Проблема не может быть вызвана ни подклассом UIView (как отображается glClear()), ни кодом, загружающим текстуры, поскольку все IVAR соответствующих экземпляров вычисляются правильно. Кроме того, даже координаты текстуры и вершины принимают обычные значения, которые такие же, как в примере кода. Таким образом, проблема, должно быть, вызвана какой-то крошечной ошибкой, которую я допустил при использовании OpenGL.
Это все мои вызовы OpenGL:
Инициализация:
CGRect rect = [[UIScreen mainScreen] bounds];
// Set up OpenGL projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, rect.size.width, rect.size.height);
// Initialize OpenGL states
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);
glEnableClientState(GL_VERTEX_ARRAY);
Рисование текстуры:
(t — указатель на структуру, содержащую информацию о том, как рисовать графику.)
glPushMatrix();
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glTranslatef(t->posX, t->posY, 0.0f);
glRotatef(-(t->rotation), 0.0f, 0.0f, 1.0f);
glColor4f(t->filter[0], t->filter[1], t->filter[2], t->filter[3]);
glBindTexture(GL_TEXTURE_2D, _texture.name);
glEnable(GL_BLEND);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, _texCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
Я думаю, что именно в этом причина проблемы. Если вы хотите увидеть мой код, создающий буфер кадров, я могу показать его вам. Это, опять же, почти то же самое, что и в примере.
Я совершенно отчаялся найти решение, поскольку я прошел весь код за один раз тысячу раз, но я не могу найти фрагмент кода, где я делаю что-то отличное от примера кода.
Заранее благодарю вас. Доминик
Ответ №1:
Каждый раз, когда вы генерируете изображение текстуры, вы должны проверять, что эта текстура действительна с помощью этого метода. Если эта текстура недопустима, вам необходимо повторно сгенерировать ее с некоторой задержкой.
GLboolean glIsTexture(GLuint texture);
Комментарии:
1. Спасибо за ваш ответ, @Toro. Я этого не знал. Я только что протестировал его, и, похоже, это не вызывает проблем. В любом случае спасибо.