带有iPhone的OpenGL ES 2.0-无法定位顶点着色器统一

带有iPhone的OpenGL ES 2.0-无法定位顶点着色器统一,iphone,opengl-es-2.0,uniform,Iphone,Opengl Es 2.0,Uniform,我有以下顶点着色器: 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 * posi

我有以下顶点着色器

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;
}
    //..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);
…和以下片段着色器

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;
}
    //..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);
..和以下Obj-C代码

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;
}
    //..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”为真)。有人能解释一下为什么会这样吗?

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

解决方案是在GluseProgramm(myProgram)之后调用它,谢谢Christian。@Komododeve No,规范中没有提到这一点。您不需要使用程序来获得统一的位置。它必须已经成功链接(在调用
glLinkProgram
之后)。在程序再次链接之前,位置不会更改,否则在每帧中查询统一位置将非常繁琐。对不起-是的,我是指glLinkProgram(>@KomodoDave),所以我的答案是您问题的正确解决方案?很抱歉打扰您,但我相信您知道我在找什么。