Android OpenGL ES-未找到矢量制服-仅矩阵有效

Android OpenGL ES-未找到矢量制服-仅矩阵有效,android,opengl-es,Android,Opengl Es,我尝试用OpenGLES 2制作一个应用程序。有2个设备用于测试。 不幸的是,两者之间似乎存在差异 我有以下用于测试的“基本”着色器代码: // vertex shader uniform mat4 uVMatrix; // View Matrix uniform mat4 uPMatrix; // perspective Matrix uniform vec3 uLight1Pos; // LightPos attribute vec4 a

我尝试用OpenGLES 2制作一个应用程序。有2个设备用于测试。 不幸的是,两者之间似乎存在差异

我有以下用于测试的“基本”着色器代码:

// vertex shader

uniform mat4 uVMatrix;          // View Matrix
uniform mat4 uPMatrix;          // perspective Matrix
uniform vec3 uLight1Pos;        // LightPos

attribute vec4 aPosition;
attribute vec4 aColor;

varying vec4 vColor;

void main() {
    vColor = aColor;
    mat4 MVPMatrix = uPMatrix * uVMatrix;   
    gl_Position = MVPMatrix * aPosition;
}

// fragment shader

uniform mat4 uVMatrix;
uniform vec3 uLight1Pos;

varying vec4 vColor;
varying vec3 vPosition;

void main() { 
    vec3 light2Pos = uLight1Pos;    
    gl_FragColor = vColor;
}
问题是,有些制服找不到

我像往常一样附加和链接着色器,但检查ID,如:

uVMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uVMatrix");
uPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uPMatrix");
uLight1PosHandle = GLES20.glGetUniformLocation(mProgram, "uLight1Pos");
我有不同的价值观。 在我的星系S1上,它是2,1,3(所以所有的值都是有效的——尽管顺序很奇怪)。 在我的星系S3上,它是0,1,-1(所以最后一个无法找到)

我做错了什么?我是否必须在S3(马里GPU)上以不同方式申报制服? 我意识到我必须“使用”这些制服才能得到推荐人。这就是我编写vec3 light2Pos=uLight1Pos的原因;如果我不这样做,我也没有得到S1的参考

谢谢你的帮助

托拜厄斯

-编辑-

奇怪的是,我尝试将顶点着色器的一致性从vec3更改为mat4:


看来矩阵工作得很好,我可以在使用矩阵时得到一个句柄。怎么回事?

您的“使用”对输出fragcolor没有贡献。您刚刚证明了S3在删除死代码方面比S1有更好的编译器。

您的“使用”对输出fragcolor没有贡献。您刚刚证明了S3在删除死代码方面比S1有更好的编译器。

您的“使用”对输出fragcolor没有贡献。您刚刚证明了S3在删除死代码方面比S1有更好的编译器。

您的“使用”对输出fragcolor没有贡献。您刚刚证明了S3在删除死代码方面比S1有更好的编译器。

GLSL编译器倾向于消除不利于结果的未使用统一。此行为符合OpenGL规范


在您的例子中,允许编译器消除死线
vec3 light2Pos=uLight1Pos使
uLight1Pos
uniform无用。

GLSL编译器倾向于消除不利于结果的未使用的uniform。此行为符合OpenGL规范


在您的例子中,允许编译器消除死线
vec3 light2Pos=uLight1Pos使
uLight1Pos
uniform无用。

GLSL编译器倾向于消除不利于结果的未使用的uniform。此行为符合OpenGL规范


在您的例子中,允许编译器消除死线
vec3 light2Pos=uLight1Pos使
uLight1Pos
uniform无用。

GLSL编译器倾向于消除不利于结果的未使用的uniform。此行为符合OpenGL规范

在您的例子中,允许编译器消除死线
vec3 light2Pos=uLight1Pos渲染
uLight1Pos
uniform无用。

啊,我明白了。因此,即使我“使用”了它们,它们也没有真正被使用和移除。谢谢。看来这完全是我的错啊,我明白了。因此,即使我“使用”了它们,它们也没有真正被使用和移除。谢谢。看来这完全是我的错啊,我明白了。因此,即使我“使用”了它们,它们也没有真正被使用和移除。谢谢。看来这完全是我的错啊,我明白了。因此,即使我“使用”了它们,它们也没有真正被使用和移除。谢谢。看来这完全是我的错D
uniform mat4 uLight1Pos;
mat4 lPos = uLight1Pos;