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的抱怨均匀块cbMaterial和cbFog具有不匹配的类型.有人能帮我找到我的理由吗?谢谢!
PS:据我所知,OpenGL ES可能已经在macOS 10.14和iOS 12上弃用了,我仍然需要在iOS上使用它以达到某些维护原因.
归档时间: |
|
查看次数: |
408 次 |
最近记录: |