视图或透视图矩阵被淘汰

时间:2018-11-22 18:17:06

标签: c++ opengl glfw

我这里的代码几乎可以正常工作,但是它是在剔除正面而不是背面:

auto scaleMatrix = glm::scale(glm::mat4(1.0f), glm::fvec3(0.5f, 0.5f, 0.5f));
auto rotateMatrix = glm::rotate(glm::mat4(1.0f), glm::degrees(rotation), glm::fvec3{.0f, 1.f, 0.f});
auto modelMatrix = rotateMatrix * scaleMatrix;

int w, h;
glfwGetWindowSize(window, &w, &h);
auto perspectiveMatrix = glm::perspective(90.f, w/(float)h, .1f, 100.f);

auto viewMatrix = glm::lookAt(
        glm::vec3(-1, 0, -1),
        glm::vec3(0, 0, 0),
        glm::vec3(0, 1, 0)
        );

auto mvp = perspectiveMatrix * viewMatrix * modelMatrix;

glUniformMatrix4fv(gMVPLocation, 1, GL_FALSE, &mvp[0][0]);

如果仅将模型矩阵传递给着色器,则正确的面会被剔除。但是,如果我传递MVP矩阵,则将剔除正面,同时渲染背面。不知道为什么会导致这个问题,但是我的顶点是按ccw缠绕顺序定义的,如果我不使用视图或透视矩阵,则可以很好地工作。我不知道为什么这在这里不起作用。

1 个答案:

答案 0 :(得分:3)

当您没有任何变换(即直接在剪辑空间中提供坐标)和标准深度缓冲区时,您将拥有一个左手坐标系,其中z轴指向远离观察者的方向。通过应用具有正行列式(例如旋转或正比例缩放)的模型矩阵,您不会更改方向。

如果使用glm中的视图投影矩阵,则将具有一个右手坐标系,其中z轴指向查看器。因此,您的模型将还原其方向。要解决此问题,请使用glFrontFace还原脸部的方向或设置正面的方向。