视图或透视矩阵干扰剔除

View or perspective matrices messing with culling

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

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 缠绕顺序定义的,如果我不使用视图或透视矩阵,它可以很好地工作。我不知道为什么这在这里不起作用。

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

如果您使用 glm 中的视图投影矩阵,您将拥有一个右手坐标系,其中 z 轴指向观察者。因此,您的模型将恢复其方向。要解决此问题,请恢复面部的方向或使用 glFrontFace.

设置正面的方向