Пример кода:
1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
5. glEnableVertexAttribArray(0);
Таким образом, «0» в строках 4 (первый аргумент) и 5 относится к произвольному идентификатору / местоположению, которое мы выбрали. В GLSL, если мы хотим сослаться на эти данные, нам просто нужно сослаться на тот же идентификатор:
layout(location=0) in vec4 in_Position;
Однако в другом примере программы я видел, что это было сделано по-другому, без ссылки на «расположение макетов». что-то вроде этого:
1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
5. glBindAttribLocation(shaderProgramHandle, 0, "in_position");
6. glEnableVertexAttribArray(0);
Мы добавили дополнительный шаг (5), где мы, кажется, привязываем этот указатель атрибута к определенной переменной в конкретной программе. А затем в нашем GLSL вместо этого мы просто пишем это:
in vec3 in_position;
Без ссылка на местоположение.
Если я не ошибаюсь, эти две программы, по сути, делают одно и то же ... так в чем разница? Каковы плюсы и минусы каждого метода?
(Я только что начал изучать OpenGL 3.x)