Отладка базовой текстуры OpenGL не удалась? (Iphone) - PullRequest
2 голосов
/ 11 марта 2010

У меня очень простая проблема с текстурной картой в GL на iPhone, и мне интересно, какие существуют стратегии для отладки такого рода вещей.

(Честно говоря, просто смотреть на вызовы конечных автоматов и задаться вопросом, является ли какой-либо из них неправильным или неупорядоченным, невозможно жить - есть ли инструменты для этого?)

У меня есть PNG-файл 512x512, который я загружаю с диска (не упакованный специально), создаю CGBitmapContext, затем вызываю CGContextDrawImage, чтобы извлечь из него байты. (Этот код, по сути, украден из образца Apple.) Я пытаюсь отобразить текстуру в «квад», с кодом, который выглядит по существу так: все плоские 2D-вещи, ничего особенного:

glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);    
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

GLfloat vertices[8] = {
    viewRect.origin.x, viewRect.size.height,
    viewRect.origin.x, viewRect.origin.y,
    viewRect.size.width, viewRect.origin.y,
    viewRect.size.width, viewRect.size.height        
};    
GLfloat texCoords[8] = {
    0, 1.0,
    0, 0,
    1.0, 0,
    1.0, 1.0
};

glBindTexture(GL_TEXTURE_2D, myTextureRef); // This was previously bound to 
glVertexPointer(2, GL_FLOAT , 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);    

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
  • Моя предположительно текстурированная область получается просто черной.
  • Я не вижу отладочных выходов из вызовов CG для настройки текстуры.
  • glGetError ничего не сообщает.
  • Если я упросту этот блок кода, чтобы просто нарисовать вершины, но установлю чистый цвет, область квадратора загорится точно так, как и ожидалось.
  • Если я сразу очищаю весь контекст красным, я не вижу красного - что означает, что там что-то отображается, но не содержимое моего PNG.

Что я мог делать не так? И что еще более важно, каковы правильные инструменты и методы для отладки такого рода вещей, потому что столкновение с такой проблемой и неспособность каким-либо осмысленным образом «пройти через нее» в отладчике - облом.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Да, в общем, есть инструменты. gDEBugger - стандартный отладчик GL для такого рода вещей. Это коммерческий продукт.

Альтернативные варианты включают в себя затенение состояния GL самостоятельно или попытку реинжиниринга используемой вами реализации (в общем, это вряд ли будет работать хорошо, если ваша платформа не предоставляет отладочную реализацию, но у некоторых людей был очень весело с этим).

Или ... вы всегда можете использовать Mesa и просто войти.

3 голосов
/ 11 марта 2010

glTexParameteri () и друзья контролируют состояние для каждой текстуры, а не глобальное состояние GL. Попробуйте связать текстуру, которую хотите изменить, перед тем, как ее выдавать.

Как есть, myTextureRef, скорее всего, неполный .

1 голос
/ 18 марта 2010

Каков результат, если вы просто нарисуете квад без текстуры и без установить цвет? Если это черный, попробуйте используя GL_REPLACE вместо GL_MODULATE. - Морис Гилден 11 марта в 16.15

Это сделал это. МОДУЛЬ не работал. ЗАМЕНА сделала. Спасибо, Морис.

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