Приложение 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);
    
Другие вопросы по тегам