带有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),所以我的答案是您问题的正确解决方案?很抱歉打扰您,但我相信您知道我在找什么。