我试图用OpenGL和C创建一个简单的游戏,遇到了一个问题。我用cglm库设置了我的投影、视图和模型,如下所示:
mat4 projection;
glm_mat4_identity(projection);
glm_perspective(glm_rad(window.fov), (float) window.width / (float) window.height, 0.1f, 100.0f, projection);
setShaderMat4(mainShader, "projection", projection);
mat4 view;
glm_mat4_identity(view);
glm_translate(view, (vec3) {0.0f, 0.0f, -4.0f});
glm_rotate(view, glm_rad(55.0f), (vec3) {1.0f, 0.0f, 0.0f});
setShaderMat4(mainShader, "view", view);
mat4 model;
glm_mat4_identity(model);
glm_rotate(model, glm_rad(90.0f), (vec3) {1.0f, 0.0f, 0.0f});
drawFirstObject(); //Draws a standard OpenGL cube (with vertices, VAOs, EBOs, etc.)
setShaderMat4(mainShader, "model", model);
这是可行的,但当我想画另一个对象时,我有点卡住了。我不能这样做:
mat4 model;
glm_mat4_identity(model);
glm_rotate(model, glm_rad(90.0f), (vec3) {1.0f, 0.0f, 0.0f}); //Perform first translation on first cube
drawFirstObject();
glm_scale(model, (vec3) {0.5, 0.5, 0.5}); //Perform second translation on second cube
drawSecondObject();
setShaderMat4(mainShader, "model", model);
因为转换将同时应用于立方体和我想为单独的OpenGL立方体进行单独的模型转换。我不知道如何做到这一点。我需要为每个新对象设置一个新的着色器,并为每个新对象设置一个新的投影,视图和模型吗?我怀疑这是解决这个问题的方法,因为这会对大量的对象变得繁琐。
任何建议或帮助解决这个问题是appriciciated。
1条答案
按热度按时间iih3973s1#
单对象版本的代码中操作顺序已经不对了。OpenGL是一个状态机,所以它只考虑在发出绘制命令之前设置的矩阵。您必须先设置矩阵,然后绘制对象。
由于OpenGL会一个接一个地执行命令,因此您可以设置另一个矩阵并使用该矩阵绘制第二个对象:
如果要从同一摄影机位置以相同投影查看两个对象,则无需再次为第二个对象设置视图/投影矩阵,因为值保持不变。