Шейдер OpenGLESv2 glGetAttribLocation возвращает -1

#c #opengl-es

#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, amp;ret);
if(!ret)
{
    ///error handling - stripped for the internet
}

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

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

glLinkProgram(glprogram);

glGetProgramiv(glprogram, GL_LINK_STATUS, amp;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";
  

Шейдер Vert:

 // 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:

Вы не указали, какой атрибут не используется, но я предполагаю, что это «texcoord_vs», просто потому, что вы его не используете, и поэтому он удаляется компилятором шейдеров.

Я полагаю, вы хотели сказать texcoord_fs = texcoord_vs ?

Комментарии:

1. да, это texcoord_vs, и теперь я исправил ошибку с vertex и texcoord_vs, но ошибка все та же : (

2. Использует ли ваш шейдер фрагментов texcoord_fs?

3. атм, я прокомментировал использование, но на этом все .. не думал, что компилятор использует эту оптимизацию. спасибо вам действительно, очень большое 😉

4. Действительно ли ваш фрагментный шейдер использует значение texcoord_fs, которое вы ему передаете? Если нет, то texcoord_vs, возможно, все еще оптимизируется, поскольку он фактически не используется.

5. Да, компилятор отслеживает, что используется, и удаляет все, что в конечном итоге оказывается неиспользуемым, что хорошо, потому что вы не можете позволить себе никаких потерь в шейдере. Кстати, пожалуйста, примите этот ответ с пометкой, если ваша проблема решена. Спасибо!