glGetProgramiv returns 活动制服数量减少,为什么?
glGetProgramiv returns a lower number of active uniforms, why?
我正在为 Android 使用 opengl es 2.0 和 java 中的 glsl 开发游戏框架。
我做了一个方法,自动将 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);
}
}
发生这种情况的原因是,正如我在评论中所说,一组制服被报告为仅活动制服。
https://www.opengl.org/sdk/docs/man/html/glGetActiveUniform.xhtml
"Only one active uniform variable will be reported for a uniform array."
我正在为 Android 使用 opengl es 2.0 和 java 中的 glsl 开发游戏框架。 我做了一个方法,自动将 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);
}
}
发生这种情况的原因是,正如我在评论中所说,一组制服被报告为仅活动制服。
https://www.opengl.org/sdk/docs/man/html/glGetActiveUniform.xhtml
"Only one active uniform variable will be reported for a uniform array."