C语言 对不同的OpenGL对象执行不同的变换

xt0899hw  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(135)

我试图用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。

iih3973s

iih3973s1#

单对象版本的代码中操作顺序已经不对了。OpenGL是一个状态机,所以它只考虑在发出绘制命令之前设置的矩阵。您必须先设置矩阵,然后绘制对象。

mat4 model;
glm_mat4_identity(model);
glm_rotate(model, glm_rad(90.0f), (vec3) {1.0f, 0.0f, 0.0f});

setShaderMat4(mainShader, "model", model);
drawFirstObject(); //Draws a standard OpenGL cube (with vertices, VAOs, EBOs, etc.)

由于OpenGL会一个接一个地执行命令,因此您可以设置另一个矩阵并使用该矩阵绘制第二个对象:

mat4 model;
glm_mat4_identity(model);
glm_rotate(model, glm_rad(90.0f), (vec3) {1.0f, 0.0f, 0.0f});

setShaderMat4(mainShader, "model", model);
drawFirstObject(); //Uses the currently set matrix (rotation)

glm_mat4_identity(model); //Reset matrix
glm_scale(model, (vec3) {0.5, 0.5, 0.5}); //Construct second matrix

setShaderMat4(mainShader, "model", model);
drawSecondObject(); //Uses the newly set matrix (scaling)

如果要从同一摄影机位置以相同投影查看两个对象,则无需再次为第二个对象设置视图/投影矩阵,因为值保持不变。

相关问题