统一类型不匹配错误 - 在Android 7/8/9上链接但在iOS 10/11上失败的OpenGL ES 3.0着色器程序?

Hon*_*ang 9 shader android opengl-es glsl ios

在iOS上链接OpenGL es shader 3.0程序时,我感到很沮丧.

我有一个顶点着色器和一个片段着色器,它们被链接以生成一个程序.两个着色器中都有共享的制服和统一块.我知道这些制服必须具有完全相同的类型,精度和名称,因此我甚至可以将统一声明从一个着色器复制到另一个着色器.

这是我的顶点着色器的代码:

// Vertex shader
#version 300 es
precision highp float;

// ........................... 
// Shared uniforms ...

uniform mat4 viewMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 texcoordMatrix;
uniform mat4 projMatrix;

uniform bool shadingEnabled;
uniform bool fogEnabled;
uniform bool flatShading;
uniform bool specularEnabled;
uniform bool generateReflectionTexCoord;
uniform float zBias;

layout (std140) uniform cbFog
{
    int     g_fogMode;
    float   g_fogStart;
    float   g_fogEnd;
    float   g_fogDensity;
    vec4    g_fogColor;
};
layout (std140) uniform cbMaterial
{
    vec4 mtlAmbient;
    vec4 mtlDiffuse;
    vec4 mtlSpecular;
    vec4 mtlEmissive;
    int  mtlSpecularPower;
    float _padding4;
    float _padding5;
    float _padding6;
};

// ........................... 
// Vertex shader's input and output ...

// ........................... 
// Vertex shader code ...
Run Code Online (Sandbox Code Playgroud)

这是我的片段着色器的代码:

// Fragment shader
#version 300 es
precision highp float;

// ........................... 
// Shared uniforms ...

uniform mat4 viewMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 texcoordMatrix;
uniform mat4 projMatrix;

uniform bool shadingEnabled;
uniform bool fogEnabled;
uniform bool flatShading;
uniform bool specularEnabled;
uniform bool generateReflectionTexCoord;
uniform float zBias;

layout (std140) uniform cbFog
{
    int     g_fogMode;
    float   g_fogStart;
    float   g_fogEnd;
    float   g_fogDensity;
    vec4    g_fogColor;
};
layout (std140) uniform cbMaterial
{
    vec4 mtlAmbient;
    vec4 mtlDiffuse;
    vec4 mtlSpecular;
    vec4 mtlEmissive;
    int  mtlSpecularPower;
    float _padding4;
    float _padding5;
    float _padding6;
};

// ........................... 
// Fragment shader's input and output ...

// ........................... 
// Fragment shader code ...
Run Code Online (Sandbox Code Playgroud)

请注意,所有均匀声明都从顶点着色器复制到片段着色器中,以保证它们完全相同.

结果是该程序可以在Android和一些OpenGL ES模拟器(如PowerVR)上成功链接,但它无法在iOS 10/11上链接,以下是错误消息:

Error when linking shader program:
ERROR: Uniform type mismatch '<uniform cbMaterial>'
ERROR: Uniform type mismatch '<uniform cbFog>'
Run Code Online (Sandbox Code Playgroud)

iOS的OpenGL ES的抱怨均匀块cbMaterialcbFog具有不匹配的类型.有人能帮我找到我的理由吗?谢谢!

PS:据我所知,OpenGL ES可能已经在macOS 10.14和iOS 12上弃用了,我仍然需要在iOS上使用它以达到某些维护原因.