Поскольку актуальных вопросов нет, я попытаюсь дать некоторые комментарии к опубликованному коду, которые могут объяснить непредвиденное поведение результирующей программы.
- Инициализируется переменная
angle
, затем назначаетсянемедленно с новым значением;релевантно только это новое значение, тогда все кубики должны вращаться со скоростью 20 градусов в секунду. (это не проблема) - Матрица
view
переназначается с новым значением для каждого объекта! Крайне маловероятно, что это то, что вам нужно.
Это похоже на то, что, когда вы рисуете один кадр, вы перемещаете камеру перед каждым нарисованным объектом;если вы перемещаете камеру и объект одинаково, то все отображается в одном и том же месте в визуализированном кадре. (Я думаю, что это главная проблема)
Вы должны выбрать один раз для всей матрицы view
(а также матрицы projection
) для всего кадра.
Некоторые другие комментарии, не имеет прямого отношения:
- Вы должны получить одинаковые местоположения один раз для всех перед циклом (и даже в начале программы), поскольку они не изменятся, пока вы используете один и тот же шейдерprogram.
glUniformMatrix4fv()
вызовы projection
и view
должны произойти один раз для всех перед циклом;только матрица model
изменяется от одного объекта к другому.
Это может выглядеть так
GLint modelLoc = glGetUniformLocation(ourShader.Program, "model");
GLint viewLoc = glGetUniformLocation(ourShader.Program, "view");
GLint projLoc = glGetUniformLocation(ourShader.Program, "projection");
glm::mat4 projection = ... already known ...
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
glm::mat4 view = glm::mat4(1.0f);
// adjust to the layout of your scene
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -10.0f));
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
for(unsigned int i = 0; i < 25; i++)
{
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, cubePositions[i]);
// the same rotation rate but a different offset for each object
float angle = 20.0f * i;
angle += std::fmod(glfwGetTime() * 20.0f, 360.0f);
// choose x or y rotation axis
auto axis=(i%2) ? glm::vec3(1.0f, 0.0f, 0.0f) : glm::vec3(0.0f, 1.0f, 0.0f);
model = glm::rotate(model, glm::radians(angle), axis);
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
glDrawArrays(GL_TRIANGLES, 0, 36);
}