OpenGLESv2 Shader glGetAttribLocation返回-1

时间:2011-04-28 23:03:33

标签: c++ opengl-es

嘿,我尝试编写一个OpenGL ES 2引擎,但是在着色器创建时,函数glGetAttribLocation返回-1,这意味着

  

命名属性变量不是   指定的活动属性   程序对象或名称以   保留的前缀“gl _”。

但是它在着色器中定义并且不以gl_开头。 我的代码怎么了?

C ++代码:

glprogram = glCreateProgram();

glvertshader = glCreateShader(GL_VERTEX_SHADER);
glfragshader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(glvertshader, 1, vertsrc, NULL);
glShaderSource(glfragshader, 1, fragsrc, NULL);

GLint ret;

glCompileShader(glvertshader);
glGetShaderiv(glvertshader, GL_COMPILE_STATUS, &ret);
if(!ret)
{
    ///error handling - stripped for the internet
}

glCompileShader(glfragshader);
glGetShaderiv(glfragshader, GL_COMPILE_STATUS, &ret);
if(!ret)
{
    ///error handling - stripped for the internet
}

glAttachShader(glprogram, glvertshader);
glAttachShader(glprogram, glfragshader);

glLinkProgram(glprogram);

glGetProgramiv(glprogram, GL_LINK_STATUS, &ret);
if(!ret)
{
    ///error handling - stripped for the internet
}

glattributes[0] = glGetAttribLocation(glprogram, "vertex");
glattributes[1] = glGetAttribLocation(glprogram, "texcoord_vs");



std::cout << "texcoord " << glGetAttribLocation(glprogram, "texcoord_vs";

垂直着色器:

// Vertex Shader for OpenGL ES
uniform mat4 projmat;
uniform mat4 modviewmat;

attribute vec2 vertex;
attribute vec2 texcoord_vs;

varying vec2 texcoord_fs;

void main()
{
    texcoord_fs = texcoord_vs;
    gl_Position = projmat*modviewmat*vec4(vertex, 0.0, 1.0);
}

编辑:正确的着色器代码,错误在于texcoord_vs。

1 个答案:

答案 0 :(得分:3)

您没有指定哪个属性未被使用,但我认为它是“texcoord_vs”,只是因为您没有使用它,因此它被着色器编译器剥离。

我想你想说texcoord_fs = texcoord_vs