Когда вы используете glew, включите дополнительные расширения с помощью glewExperimental = GL_TRUE;
.См. Документацию GLEW , в которой говорится:
GLEW получает информацию о поддерживаемых расширениях из графического драйвера.Однако экспериментальные или предварительные версии драйверов могут не сообщать о всех доступных расширениях через стандартный механизм, и в этом случае GLEW сообщит о том, что оно не поддерживается.Чтобы обойти эту ситуацию, глобальный коммутатор glewExperimental
можно включить, установив его на GL_TRUE
перед вызовом glewInit()
, что обеспечивает доступ ко всем расширениям с действительными точками входа.
glewExperimental = GL_TRUE;
GLenum glewInitError = glewInit();
if(GLEW_OK != glewInitError) {
std::cerr << glewGetErrorString(glewInitError) << std::endl;
return EXIT_FAILURE;
}
Когда именованный буферный объект привязан к цели GL_ARRAY_BUFFER
, последний параметр glVertexAttribPointer
обрабатывается как смещение байта в этом буфере.
Когда glVertexAttribPointer
вызывается, затем спецификация массива вершин сохраняется в векторе состояний текущего привязанного объекта массива вершин.Буфер, который в настоящее время привязан к цели GL_ARRAY_BUFFER
, связан с атрибутом, а имя (значение) объекта сохраняется в векторе состояний VAO.
Далее отметим, что 5-й параметр ()stride ) из glVertexAttribPointer
, указывает смещение байта между последовательным универсальным атрибутом вершины.
Это означает, что перед вызовом glVertexAttribPointer
объект Vertex Array и объект Vertex Buffer должны быть связаны.
Шаг *Параметр 1037 * должен быть 5*sizeof(Glfloat)
, поскольку атрибуты вершины состоят из 5 GLfloat
значений (x, y, r, g, b).
Смещение для VERTEX_ATTR_POSITION
равно 0, а для VERTEX_ATTR_COLOR
это 2*sizeof(GLfloat)
, потому что (r, gb) - после (x, y).Обратите внимание, что GL_FLOAT
является константой перечислителя, а не типом данных, поэтому 2*sizeof(GL_FLOAT)
не делает то, что вы ожидаете.
//triangle data
GLfloat vertices[] = { -0.5f, -0.5f, 1.f, 0.f, 0.f, //2 coordinates + 1 0 0 color
0.5f, -0.5f, 0.f, 1.f, 0.f,
0.0f, 0.5f, 0.f, 0.f, 1.f };
// create vertex buffer object
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// vertex array object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// specify the array of generic vertex attribute data
glBindBuffer(GL_ARRAY_BUFFER, vbo); // if "vbo" is still bound then that would not be necessary
glVertexAttribPointer(VERTEX_ATTR_POSITION, 2, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), nullptr);
glVertexAttribPointer(VERTEX_ATTR_COLOR, 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), 2*sizeof(GLfloat));
glEnableVertexAttribArray(VERTEX_ATTR_POSITION);
glEnableVertexAttribArray(VERTEX_ATTR_COLOR);
// the following is not necessary, you can let them bound
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Убедитесь, что индексы вершинных атрибутов верны:
const GLuint VERTEX_ATTR_POSITION = 3;
const GLuint VERTEX_ATTR_COLOR = 8;
3 и 8 возможны, но кажутся странными.Это не должны быть индексы ресурсов атрибутов, которые могут быть установлены с помощью квалификатора макета или могут быть получены с помощью glGetAttribLocation
после связывания программы.
Кстати, координаты равностороннего треугольника, например:
GLfloat vertices[] = {
x y r g b
-0.866f, -0.5f, 1.f, 0.f, 0.f,
0.866f, -0.5f, 0.f, 1.f, 0.f,
0.0f, 1.0f, 0.f, 0.f, 1.f };