我正在使用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);
}
}
答案 0 :(得分:0)
发生这种情况的原因是,正如我在评论中所说,一系列制服被报道为只是一个活跃的单位。
https://www.opengl.org/sdk/docs/man/html/glGetActiveUniform.xhtml
“统一数组只会报告一个活动的统一变量。”