基本上,您正在寻找替代 opengl 矩阵堆栈来进行转换。
假设您使用的是 c/c++,我建议您看看 GLM 库:http://glm.g-truc.net/
这是一个仅包含标头的库,易于使用,是 opengl es 2.0 之前的矩阵堆栈的完美替代品。它甚至为已弃用的 glu 函数(如 gluOrtho() 和 gluPerspective())提供功能。 Glm 的矩阵可以很容易地传递给您的着色器,因为它们是在考虑着色器的情况下构思的。
您必须对代码进行一些更改;例如将您自己的顶点/矩阵定义转换为 glm::vec3 / glm::mat4。
下面是我如何构造传递给顶点着色器的 mvp 矩阵的示例:在这种情况下,actorInstance 类具有一些属性,例如位置(在世界中)和定义为 glm::vec3 的旋转。构造的模型、模型/视图和模型/视图/投影矩阵都是类的属性:
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
};
希望这会有所帮助:)
编辑:实现矩阵堆栈的建议
stl::stack<glm::mat4> matrixStack; // the matrix stack
matrixStack.push_back(glm::mat4()); // push an identity matrix on the stack
这就是你的 glLoadIdentity()...