Приложение OpenGL падает, когда VBO не используется
Я пытаюсь рисовать объекты без использования VBO в OpenGL ES 2.0. Мой код время от времени приводит к сбою приложения (не всегда даже ничего не меняется). Ниже приведен код. Я думаю, проблема в том, что я включаю только m_distLocation без отправки каких-либо данных в шейдер. Все однородные значения установлены правильно. Я думаю, что проблема только в переменных атрибутов (m_posAttr и m_distLocation), привязка.
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glEnableVertexAttribArray(m_posAttr);
glEnableVertexAttribArray(m_distLocation);
int posAttrSize = sizeof(float) * 2;
GLintptr posAttrStart = reinterpret_cast<GLintptr>(&vertices[0]);
glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, posAttrSize, reinterpret_cast<GLvoid*>(posAttrStart));
glVertexAttribPointer(m_distLocation, 0, GL_FLOAT, GL_FALSE, 0, 0);
glBindAttribLocation(m_programID, m_posAttr, "posAttr" );
glBindAttribLocation(m_programID, m_distLocation, "distance" );
glUniform1i(m_patternLocation, -1);
glUniform4fv(m_colorAttr, 1, vColor);
glUniform1f(m_depthAttr, z);
glUniform1f(m_zoom, _zoom / 100);
glUniform2fv(m_scale, 1, _scale);
glUniform2fv(m_translate, 1, _trans);
glUniform1f(m_theta, _theta);
glDrawArrays(et, offsetInBytesFill, nVerticesFill );
glDisableVertexAttribArray(m_posAttr);
glDisableVertexAttribArray(m_distLocation);
Буду признателен за любую помощь.
1 ответ
В размещенном фрагменте кода есть ряд сомнительных аспектов:
glBindAttribLocation()
вступает в силу только если он вызывается раньшеglLinkProgram()
, В противном случае местоположения будут назначаться автоматически при связывании, и вы не сможете изменить их, если не переподключите программу. Чтобы получить уже назначенные местоположения, вы можете заменить эти вызовы на:m_posAttr = glGetAttribLocation(m_programID, "posAttr"); m_distLocation = glGetAttribLocation(m_programID, "distance");
Эти утверждения, очевидно, должны быть размещены перед использованием значений.
Второй аргумент к этому вызову
glVertexAttribPointer()
незаконноglVertexAttribPointer(m_distLocation, 0, GL_FLOAT, GL_FALSE, 0, 0);
Второй аргумент - это число компонентов в атрибуте, и он должен быть 1, 2, 3 или 4. Если атрибут является скалярным плавающим числом, как следует из названия, правильное значение будет 1.
При том же вызове, поскольку вы не используете VBO, последний аргумент должен быть действительным указателем. Скажи если
distances
это массив / вектор значений расстояния, вызов должен выглядеть так:glVertexAttribPointer(m_distLocation, 1, GL_FLOAT, GL_FALSE, 0, &distances[0]);
Исходя из того, что предлагает имя переменной, это также выглядит так, как будто это неправильно:
glDrawArrays(et, offsetInBytesFill, nVerticesFill);
Второй аргумент - это индекс первой вершины, которую нужно нарисовать. Он не измеряется в байтах. Например, если у вас есть атрибуты для 40 вершин в ваших массивах вершин, и вы хотите нарисовать 10 вершин, начиная с вершины 20 (то есть вершин с 20 по 29), вызов будет:
glDrawArrays(et, 20, 10);