2012-03-22 50 views
5

我有一个具有以下属性的片段着色器:glGetUniformLocation返回-1的OpenGL ES(iPhone)

varying highp vec2 coordinate; 
precision mediump float; 

uniform sampler2D videoframe; 
uniform sampler2D videosprite; 
uniform vec4 mask; 
uniform float threshold; 

我得到他们的位置,后来设置它们:

_frame = glGetUniformLocation(_program, "videoframe"); 
_sprite = glGetUniformLocation(_program, "videosprite"); 
_mask = glGetUniformLocation(_program, "mask"); 
_threshold = glGetUniformLocation(_program, "threshold"); 

NSLog(@"%i %i %i %i", _frame, _sprite, _mask, _threshold); 

但是,日志揭示:0 2 1 -1

从文档,我看到-1(门槛统一)意味着它失败。为什么失败? 谢谢

回答

10

GLSL编译器可以(通常会)优化掉没有在着色器中使用的任何制服和属性。您只能查询活动制服的位置,即在着色器的至少一个分支中使用的位置。

所以我猜threshold变量没有在着色器代码中的任何地方使用。但是在这种情况下,无论如何你都不需要它的价值,并且为位置-1设置统一的值将不会做任何事情。所以你实际上不必担心这一点。

+0

哇...即使我知道这一点,谢谢你的提醒。这是问题... – 0xSina 2012-03-22 18:31:44