Java 无法获取openGL ES变量的句柄

Java 无法获取openGL ES变量的句柄,java,android,opengl-es,Java,Android,Opengl Es,我正在使用教程中提供的以下顶点着色器: "uniform mat4 matriceDessin;" + "uniform mat4 matriceVueCamera;" + "uniform vec3 positionLumiere;" + "attribute vec4 positionsSommets;" + "attribute v

我正在使用教程中提供的以下顶点着色器:

                "uniform mat4 matriceDessin;" +
                "uniform mat4 matriceVueCamera;" +
                "uniform vec3 positionLumiere;" +
                "attribute vec4 positionsSommets;" +
                "attribute vec3 vecteursNormaux;" +
                "attribute vec4 couleursSommets;" +

                "varying vec4 v_Color;" +

                "void main() {" +
                    "vec3 sommet,vecteurNormal,directionLumiere;"+
                    "float distance,diffuse;" +

                    "sommet = vec3(matriceVueCamera * positionsSommets);" +
                    "vecteurNormal = vec3(matriceVueCamera * vec4(vecteursNormaux, 0.0));" +
                    "distance = length(positionLumiere - sommet);" +
                    "directionLumiere = normalize(positionLumiere - sommet);" +
                    "diffuse = max(dot(vecteurNormal, directionLumiere), 0.1);" +
                    "diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));" +
                    "v_Color = couleursSommets;" +

                    "gl_Position = matriceDessin * positionsSommets;" +
                "}";
为了获取变量的位置,在成功创建并链接程序后,我使用:

            GLES31.glUseProgram(programme);
            pointeurSurPosition = GLES31.glGetAttribLocation(programme, "positionsSommets");
            pointeurSurVecteurNormal = GLES31.glGetAttribLocation(programme, "vecteursNormaux");
            pointeurSurPositionLumière = GLES31.glGetUniformLocation(programme, "positionLumiere");
            pointeurSurMatriceDessin = GLES31.glGetUniformLocation(programme, "matriceDessin");
            pointeurSurMatriceVueCaméra = GLES31.glGetUniformLocation(programme, "matriceVueCamera");
我面临的问题是,为检索
matriceVueCamera
positionLumiere
vectuersnormax
的位置而进行的调用总是返回-1(其他位置被正确检索)

根据文档,如果变量不是活动的,可能会发生这种情况,但是可以注意到它们在着色器中使用,因此它们应该被视为活动的,至少就我所理解的概念而言

在链接程序之前,我尝试使用
glBindAttribLocation
将位置绑定到此变量,但没有任何帮助

有人知道我的问题在哪里吗


我使用OpenGL ES 3.1。

局部变量
diffuse
由计算,但从未在程序中使用。由于着色器代码由驱动程序优化,因此会丢弃所有代码,用于计算
漫反射
。 由于统一变量
matriceVueCamera
positionLumiere
vectuersnormax
仅用于计算
diffuse
,因此它们不会成为活动的程序资源。他们不需要处理程序

当计算
v_Color
时,您可能没有使用
diffuse

v_Color=couleursommets*漫反射;
见:

7.6统一变量

着色器可以声明命名的统一变量,如OpenGL ES着色语言规范中所述。这些制服的值在一段时间内保持不变 基本体,通常它们在许多基本体中都是常量。如果编译器和链接器确定统一是活动的,则认为统一是活动的 将在执行可执行代码时实际访问。如果编译器和链接器无法做出结论性决定,则统一将被删除 被认为是积极的


你是对的!缺少“漫反射”的使用是我不同的尝试的结果,而不是一个没有链接的程序或一个黑屏。现在,我得到了变量的句柄,但是当顶点颜色乘以“漫反射”时,我的屏幕会保持黑色。仍然需要调查,可能是在数据方向,而不是着色器的代码方向…@Zelig63可能
diffuse
小于0.0或接近0.0。尝试
v_Color=couleursommets*(0.5+0.5*最大值(0.0,漫反射))diffuse=0.1f在倍增颜色之前:对象很难看到,但它确实在那里…问题似乎与
距离
变量有关。如果我在计算线之后将其设置为1.0,我会获得足够逼真的场景照明。我的最后一个问题是衰减因子随着我定义的位置数据距离的增加而从远到快增加。屏幕中不再是空白。再次感谢你的帮助,拉比!