2011-08-29 71 views
1

我有以下顶点着色器的OpenGL ES 2.0与iPhone - 顶点着色均匀不能位于

uniform mediump mat4 projMx; 

attribute vec2 a_position;  
attribute vec4 a_color;  
attribute float a_radius;  
varying vec4 v_color; 
void main() 
{ 
    vec4 position = vec4(100.0,600.0,1.0,1.0); 
    gl_Position = projMx * position; 
    gl_PointSize = a_radius*2.0; 
    v_color = a_color; 
} 

..和下面片段着色器

#ifdef GL_FRAGMENT_PRECISION_HIGH 
    precision highp float; 
#else 
    precision mediump float; 
#endif 

varying vec4 v_color; 
void main() 
{ 
    gl_FragColor = v_color; 
} 

..以及以下Obj-C代码

//..shaders have been created.. 
program = glCreateProgram(); 
glAttachShader(program, shaders[0]); 
glAttachShader(program, shaders[1]); 

GLfloat projMx[16] = {2/screenWidth,0,0,-1,0,2/-screenHeight,0,1,0,0,-2,-1,0,0,0,1}; 

projMxId = glGetUniformLocation(program, "projMx"); 
NSLog(@"uniform location:%i",projMxId); 

'projMx'的统一位置是-1(即, 'projMxId == -1'为true)。有人能解释为什么会出现这种情况吗?

回答

3

您只能在链接程序(您不这样做)后检索统一的位置,因为这些是每个程序状态并且在程序的每个着色器中都是已知的。 GLSL编译器可以在链接过程中优化未使用的制服,因此只有在链接后才能知道它们的位置,这也是所有属性未明确绑定的位置才能获取其位置的时刻。

+0

解决方法是在glUseProgram(myProgram)之后调用它,谢谢Christian。 – KomodoDave

+0

@KomodoDave不,规范没有提到任何有关的内容。你不需要使用该程序来获得统一的位置。它必须已成功链接(调用'glLinkProgram'后)。在程序再次链接之前,位置不会改变,否则每帧查询统一位置将会非常繁琐。 –

+0

对不起 - 是的我的意思是glLinkProgram(> _ <) – KomodoDave