【问题标题】:iOS OpenGL Shader doen't work on actual deviceiOS OpenGL Shader 在实际设备上不起作用
【发布时间】:2011-04-20 12:06:59
【问题描述】:

我有一个可用的 GLSL 着色器,它可以在 PC 上使用 OpenGL ES 模拟器和 iOS 模拟器运行。当我在真正的 iPad(运行 iOS v4.2)上运行它时,它不会呈现。着色器编译并链接,但我从 glValidateProgram 收到以下错误:

片段程序在当前上下文状态下编译失败

顶点程序在当前上下文状态下编译失败

这是 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"
    "}   

 

【问题讨论】:

    标签: iphone opengl-es glsl


    【解决方案1】:

    您是否正确设置了当前上下文?我知道我忘记设置上下文,导致我的着色器无法编译。

    确保你做一个

    [EAGLContext setCurrentContext:context];
    

    在初始化着色器之前,在使用类似的东西创建上下文之后

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

    【讨论】:

      【解决方案2】:

      从正常计算中删除 - 1.1 似乎可以解决问题,但不确定原因。

      " vec3 norm = texture2D( ES_Sampler1, iTexture).rgb * 2.0;   \n" 
      

      【讨论】:

      • 是操作顺序吗? *- 之前?
      • 这是因为 texture2D 返回一个 vec4。您不能从向量类型中减去标量 1.1。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多