glGetProgramiv返回较少数量的活动制服,为什么?

时间:2015-03-12 19:36:24

标签: java android glsl opengl-es-2.0 uniform

我正在使用opengl es 2.0和java中的glsl为Android做游戏框架。 我做了一个方法,自动将GL程序中的所有活动制服加载到带有定位器的java地图。我找到的问题是该行

        GLES20.glGetProgramiv( this.m_GL_Program_ID, GLES20.GL_ACTIVE_UNIFORMS, total, 0);

正在返回我在顶点着色器中声明的制服数量较少的制服。我知道如果编译器没有使用,可以切割一些制服,但我测试了这个试图得到m_Joint_Matrix [30]并且它返回了一个不同于-1的值(glGetProgram返回了28个活动制服)所以它不切割所有这些制服。

那么......你觉得我做错了什么?这是函数的代码(注意var debug_value,我测试我的联合矩阵均匀):

private void loadUniformCache(){
    int[] total = new int[1];

    GLES20.glGetProgramiv( this.m_GL_Program_ID, GLES20.GL_ACTIVE_UNIFORMS, total, 0);

    Map<String, Triplet<Integer, Integer, Object>> mapa_programa = m_Uniform_Cache_Store.get(this.m_GL_Program_ID);
    if (mapa_programa == null){
        mapa_programa = new HashMap<String, Triplet<Integer, Integer, Object>>();
        m_Uniform_Cache_Store.put(this.m_GL_Program_ID, mapa_programa);
    }

    for(int i=0; i < total[0]; ++i)  {

        int[] uniformType = new int[1];
        int[] uniformSize = new int[1];

        String uniformName = GLES20.glGetActiveUniform( this.m_GL_Program_ID, i, uniformSize, 0, uniformType, 0);

        int uniformLocation = GLES20.glGetUniformLocation(this.m_GL_Program_ID, uniformName);

        int debug_value = GLES20.glGetUniformLocation(this.m_GL_Program_ID, "m_Joint_Matrix_Array[30]");

        // tupla de location, último valor asignado al uniform
        Triplet<Integer, Integer, Object> uniform_location_type_and_value = new Triplet<Integer, Integer, Object>(uniformLocation, uniformType[0], null);

        mapa_programa.put(uniformName, uniform_location_type_and_value);
    }
}

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是,正如我在评论中所说,一系列制服被报道为只是一个活跃的单位。

https://www.opengl.org/sdk/docs/man/html/glGetActiveUniform.xhtml

“统一数组只会报告一个活动的统一变量。”