2014-12-05 2 views
0

Я нашел, что какой-то особый стиль письма GLSL заставит iPhone 6 Plus сбой без какого-либо журнала.Код GLSL сделать приложение аварии на iPhone 6 Plus

Например, если вы напишете код GLSL, приведенный ниже, он будет разбит на glLinkProgram.

float testFun(float co) { 
    return co; 
} 

float a = testFun(0.1); 

void main() 
{ 
    // your code here 
} 

Но если вы переместите определение «a» в функцию, то оно будет работать правильно.

Этого не произошло бы в iPhone5 или 5s.

Вы смогли воспроизвести эту ошибку путем загрузки образца проекта на

http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0

затем заменить SimpleFragment.glsl с

varying lowp vec4 DestinationColor; 

varying lowp vec2 TexCoordOut; // New 
uniform sampler2D Texture; // New 

precision highp float; 

float testFun(float co) { 
    return co; 
} 

float a = testFun(0.1); 

void main() 
{ 
    gl_FragColor = vec4(0.7, 0.5, 0.3, 1.0); 
} 

и запустить его на вашем iPhone 6 Plus. Он немедленно сработает.

+0

Что вы думаете? Это больше похоже на отчет об ошибке. Который должен, вероятно, пойти в Apple. –

+0

Thankyou очень много. Уже сообщалось Apple – chenxiao07

ответ

0

Ваш код шейдера содержит ошибку.Эта линия является недействительным:

float a = testFun(0.1); 

В ES 2.0 GLSL спецификации, раздел "4.3 Хранение Qualifiers" на странице 29 говорит (курсив наш):

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

Теперь вопрос будет, если testFun(0.1) является постоянным выражением. Раздел «5.10 константные выражения» на странице 49 разъясняется, что:

Не могут быть использованы в константных выражениях:

  • Пользовательские функции

Тот факт, что Shader компилятор выглядит как ошибка Apple. Запишите это с ними.

1

Сначала эти 3 iPhone вы упомянули есть 3 различных GPU:

  • iPhone 5 -> SGX543
  • iPhone 5s -> A7
  • iPhone 6/Plus -> A8

Это означает, что у него, вероятно, есть другой драйвер в iOS, а реализация компиляции glsl shader также может отличаться nt, но никто на самом деле не знает этого, кроме парня Apple. На вашей стороне это означает, что вам действительно нужно запускать/отлаживать приложение на реальном устройстве, но не в мягком симуляторе.

С другой стороны, ваш iPhone 5/5s/6 Plus находится на той же версии iOS, не так ли? [Я предполагаю, что да,;]]

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

Это означает, что вы плаваете; будет содержать место регистрации, и это ограниченные ресурсы в GPU! я не думаю, что использовать глобальную переменную в glsl или, что более понятно, на большинстве языков программирования не рекомендуется.

Вы можете попытаться проверить состояние о вашем шейдере с помощью вызова функции, как показано ниже более подробно объяснить о неудаче вашего шейдера компиляции:

glGetProgramiv (программа, GL_LINK_STATUS, & link_status);
glGetProgramiv (программа, GL_INFO_LOG_LENGTH, & длина);
glGetProgramInfoLog (program, length, NULL, & log [0]);

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