Могу ли я вызвать точку останова на ошибках OpenGL в Xcode 4? - PullRequest
6 голосов
/ 08 декабря 2011

Можно ли как-нибудь установить символическую точку останова, которая будет срабатывать, когда любой вызов функции OpenGL устанавливает любое другое состояние, кроме GL_NO_ERROR?Первоначальные данные свидетельствуют о том, что opengl_error_break предназначен для того, чтобы служить именно этой цели, но он не ломается.

Ответы [ 3 ]

6 голосов
/ 20 декабря 2011

Основываясь на подходе Ларса, вы можете добиться этого отслеживания ошибок автоматически, он основан на некоторой магии препроцессора и генерации заглушек.

Я написал небольшой Python-скрипт , который обрабатываетЗаголовок OpenGL (в примере я использовал Mac OS X, но он должен работать и с iOS).

Скрипт Python генерирует два файла, заголовок для включения вваш проект везде, где вы вызываете OpenGL, как этот (вы можете назвать заголовок так, как хотите):

#include "gl_debug_overwrites.h"

Заголовок содержит макросы и объявления функций после этой схемы:

#define glGenLists _gl_debug_error_glGenLists
GLuint _gl_debug_error_glGenLists(GLsizei range);

Скрипт также создает исходный файл в том же потоке, который вы должны сохранить отдельно, скомпилировать и связать с вашим проектом.

Затем все функции gl* будут упакованы в другую функцию с префиксомс _gl_debug_error_, который затем проверяет наличие ошибок, подобных этой:

GLuint _gl_debug_error_glGenLists(GLsizei range) {
    GLuint var = glGenLists(range);
    CHECK_GL_ERROR();
    return var;
}
5 голосов
/ 19 декабря 2011

Завершение ваших вызовов OpenGL для вызова glGetError после каждого вызова в режиме отладки.Внутри метода оболочки создайте условную точку останова и проверьте, отличается ли возвращаемое значение glGetError от GL_NO_ERROR.

Подробности:

Добавьте этот макрос вваш проект (из проекта OolongEngine):

#define CHECK_GL_ERROR() ({ GLenum __error = glGetError(); if(__error) printf("OpenGL error 0x%04X in %s\n", __error, __FUNCTION__); (__error ? NO : YES); })

Поиск всех ваших вызовов OpenGL вручную или с помощью соответствующего RegEx.Затем у вас есть два варианта, показанных в качестве примера для вызова glViewport():

  1. Замените вызов на glViewport(...); CHECK_GL_ERROR()
  2. Замените вызов на glDebugViewport(...); и введите glDebugViewport, как показанов (1).
1 голос
/ 14 декабря 2011

Я думаю, что вы могли бы решить эту проблему - захватить кадры OpenGL ES (прокрутите вниз до "Захват кадров OpenGL ES"), который теперь поддерживается Xcode. По крайней мере, так я отлаживаю свои игры OpenGL.

Захватывая кадры, когда вы знаете, что происходит ошибка, вы можете определить проблему в стеке OpenGL без особых усилий.

Надеюсь, это поможет!

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