无法处理openGL ES变量

时间:2019-02-08 05:08:27

标签: java android opengl-es

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

                "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");

我面临的问题是,为检索matriceVueCamerapositionLumierevecteursNormaux的位置而进行的调用始终返回-1(正确检索了其他位置)。

根据文档,如果变量不是活动变量,则可能会发生这种情况,但是人们可以注意到它们在着色器中使用,因此,就我所知,至少应该将它们视为活动变量。

在链接程序之前,我尝试使用glBindAttribLocation将位置绑定到此变量,但这无济于事。

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

我使用Open GL ES 3.1。

1 个答案:

答案 0 :(得分:1)

局部变量diffuse由程序计算但从未在程序中使用。由于着色器代码是由驱动程序优化的,因此会导致所有代码都被丢弃,该代码用于计算diffuse。 由于统一变量matriceVueCamerapositionLumierevecteursNormaux仅是必需的,因此要计算diffuse,它们不会成为活动程序资源。他们不需要处理程序。

在计算diffuse时,您可能错过了使用v_Color的情况:

v_Color = couleursSommets * diffuse ;

请参见OpenGL ES Shading Language 3.00 Specification - 2.12.6 Uniform Variables; page 58

  

7.6统一变量

     

着色器可以声明命名的统一变量,如OpenGL ES着色语言规范中所述。这些制服的值在   原语,通常它们在许多原语中都是恒定的。如果由编译器和链接器确定该制服,则该制服被认为是活动的   可执行代码执行时实际上将被访问。如果编译器和链接器无法做出确定的确定,则统一名称为   被认为是活跃的。