#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. Да, компилятор отслеживает, что используется, и удаляет все, что в конечном итоге оказывается неиспользуемым, что хорошо, потому что вы не можете позволить себе никаких потерь в шейдере. Кстати, пожалуйста, примите этот ответ с пометкой, если ваша проблема решена. Спасибо!