По сути, вы ищете замену стека матрицы opengl для ваших преобразований.
Предполагая, что вы используете c / c ++, я предлагаю взглянуть на библиотеку GLM: http://glm.g -truc.net /
Это библиотека только для заголовков, простая в использовании и идеальная замена для стека матрицы pre-opengl es 2.0.Он даже предоставляет функциональность для устаревших функций glu, таких как gluOrtho () и gluPerspective ().Матрицы Glm могут быть легко переданы в ваш шейдер, так как они задуманы с учетом шейдеров.
Вам придется внести несколько изменений в свой код;например, преобразование ваших собственных определений вершин / матриц в glm :: vec3 / glm :: mat4.
Вот пример того, как я создаю свою матрицу mvp, которую я передаю вершинному шейдеру: в этом случае класс actorInstanceимеет несколько атрибутов, таких как положение (в мире) и вращение, определенные как glm :: vec3's.Матрицы построенной модели, модели / вида и модели / вида / проекции являются собственностью класса:
void CActorInstance::update(glm::mat4 viewMatrix, glm::mat4 projectionMatrix)
{
// act according to class behavior
this->actorClass->act(&input, &world, &direction, &rotation);
// calculate the translation matrix
glm::mat4 translate = glm::mat4();
translate = glm::translate( glm::mat4(), world);
// calculate the rotation matrix
glm::mat4 rotateX = glm::rotate( glm::mat4(1.0f), rotation.x, glm::vec3(1,0,0));
glm::mat4 rotateY = glm::rotate( glm::mat4(1.0f), rotation.y, glm::vec3(0,1,0));
glm::mat4 rotateZ = glm::rotate( glm::mat4(1.0f), rotation.z, glm::vec3(0,0,1));
glm::mat4 rotate = rotateX * rotateY * rotateZ;
// calculate the model matrix
mMatrix = translate * rotate;
// calculate the model/view matrix
mvMatrix = viewMatrix * mMatrix;
// calculate the model/view/projection matrix
mvpMatrix = projectionMatrix * mvMatrix;
};
Очевидно, что матрица mvp для каждого объекта обновляется в каждом кадре в соответствии с положением и поворотом объекта.ViewMatrix и projectionMatrix передаются из класса моей камеры.Затем эта матрица используется для визуализации меша:
void CMesh::renderMesh(GLuint program, glm::mat4 *mvp)
{
glUseProgram(program);
int mvpLocation = glGetUniformLocation(program, "mvpMatrix");
int texLocation = glGetUniformLocation(program, "baseMap");
glUniformMatrix4fv( mvpLocation, 1, GL_FALSE, glm::value_ptr(*mvp));
// rendering code ommitted
};
Надеюсь, это поможет:)
EDIT : предложения по реализации стека матриц
stl::stack<glm::mat4> matrixStack; // the matrix stack
matrixStack.push_back(glm::mat4()); // push an identity matrix on the stack
И это ваша glLoadIdentity () ...