iOS OpenGL Shader не работает на реальном устройстве - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть работающий шейдер GLSL, который работает на ПК с использованием симулятора OpenGL ES и симулятора iOS. Когда я запускаю его на реальном iPad (под управлением iOS v4.2), он не рендерится. Шейдер компилирует и ссылается, но я получаю следующую ошибку от glValidateProgram:

Программа фрагмента не смогла скомпилироваться с текущим состоянием контекста

Программа Vertex не смогла скомпилировать с текущим состоянием контекста

Вот код GLSL:

GLbyte vShaderStr[] =
    "uniform mat4 ES_MVP;         \n"
    "uniform vec4 ES_LightVector; \n"
    "uniform mat4 ES_InvWorld;    \n"
    "attribute vec4 vPosition;    \n"
    "attribute vec2 vTexture0;    \n"
    "attribute vec4 vNormal;      \n"
    "attribute vec4 vTangent;     \n"
    "varying vec2 iTexture;       \n"
    // "varying vec4 iNormal;       \n"
    "varying vec3 iLightDir;      \n"
    "void main()                  \n"
    "{                            \n"
    "   gl_Position = ES_MVP * vPosition;                    \n"
    "   iTexture = vTexture0;                                \n"
    //"   iNormal = vNormal;                                   \n"
    "   vec3 bitan = cross(vNormal.xyz,vTangent.xyz);        \n"
    "   bitan = bitan * vTangent.w;                          \n"
    "   vec3 fakeLight = (ES_InvWorld * ES_LightVector).xyz; \n"
    "   iLightDir.x = dot(vTangent.xyz,fakeLight);           \n"
    "   iLightDir.y = dot(bitan,fakeLight);                  \n"
    "   iLightDir.z = dot(vNormal.xyz,fakeLight);            \n"
    "}                           \n";

GLbyte fShaderStr[] =
    "precision mediump float;                   \n"
    "varying vec2 iTexture;                     \n"
    // "varying vec4 iNormal;                      \n"
    "varying vec3 iLightDir;                    \n"
    "uniform sampler2D ES_Sampler0;             \n"
    "uniform sampler2D ES_Sampler1;             \n"
    "void main()                                \n"
    "{                                          \n"
    "  vec3 norm = texture2D( ES_Sampler1, iTexture).rgb * 2.0 - 1.1;   \n" 
    "  vec4 diff = texture2D( ES_Sampler0, iTexture ).rgba;             \n"
    "  float nl = clamp(dot(norm,iLightDir),0.2, 1.0);                  \n"
    "  gl_FragColor = vec4(diff.rgb * nl,diff.a);                       \n"
    "}   

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Удаление - 1.1 из обычного расчета, казалось, сработало, не уверенная причина.

" vec3 norm = texture2D( ES_Sampler1, iTexture).rgb * 2.0;   \n" 
2 голосов
/ 20 апреля 2011

Правильно ли вы установили текущий контекст?Я знаю, что я забыл установить контекст и в результате мои шейдеры не смогли скомпилироваться.

Убедитесь, что вы делаете

[EAGLContext setCurrentContext:context];

перед инициализацией ваших шейдеров, послеэтот контекст был создан с использованием чего-то вроде

EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
...