Предупреждение файла шейдера для iPad (1-го поколения) - PullRequest
4 голосов
/ 05 ноября 2011

В настоящее время я делаю приложение для рисования OpenGL ES 2.0 для iPad и получаю следующие предупреждения относительно шейдеров:

Проверка зависимостей

Предупреждение [WARN]: нет правил для обработки файла '$ (PROJECT_DIR) / IdeaStorm / Механизм рисования / Шейдеры / Shader.fsh' типа sourcecode.glsl для архитектуры i386

Предупреждение [WARN]: нет правила для обработки файла '$ (PROJECT_DIR) / IdeaStorm / Механизм рисования / Шейдеры / Shader.vsh' типа sourcecode.glsl для архитектуры i386

Мое приложение для рисования в настоящее время работает нормально на моем iPad второго поколения с iOS 5, за исключением этой ошибки, и отлично работает в симуляторе.

Однако на днях я попытался запустить его на iPad 1-го поколения своих друзей с iOS 4.3, и шейдеры не смогли скомпилироваться.

Может ли кто-нибудь указать мне правильное направление, касающееся как этого предупреждения, так и неудачной попытки шейдеров скомпилировать iPad 1-го поколения?

1 Ответ

10 голосов
/ 06 ноября 2011

По умолчанию, когда вы добавляете вершинный и фрагментный шейдеры в свой проект, Xcode ошибочно считает их исходными файлами, которые нужно скомпилировать, а не ресурсами, которые нужно объединить.Это приводит к появлению перечисленных выше ошибок.

Удалите файлы Shader.fsh и Shader.vsh из фазы сборки источника проекта цели проекта и убедитесь, что они присутствуют в фазе ресурсов Copy Bundle Resources.

Немного странно, что ваши шейдеры успешно компилируются (во время выполнения, я полагаю) на iPad 2, но не на оригинальном iPad.Хотя у iPad 2 значительно больше шейдерной мощности, чем у iPad 1, не должно быть ничего такого, что могло бы привести к отказу шейдера на одном, когда он работает на другом.Вы можете попытаться выйти из любых сбоев компиляции шейдера, используя следующий код (в процессе компиляции шейдера):

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);

if (status != GL_TRUE)
{
    GLint logLength;
    glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
    if (logLength > 0)
    {
        GLchar *log = (GLchar *)malloc(logLength);
        glGetShaderInfoLog(*shader, logLength, &logLength, log);
        NSLog(@"Shader compile log:\n%s", log);
        free(log);
    }
}   
...