【问题标题】:View or perspective matrices messing with culling与剔除混淆的视图或透视矩阵
【发布时间】:2018-11-22 18:17:05
【问题描述】:

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

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 缠绕顺序定义的,并且工作得很好。我不知道为什么这在这里不起作用。

【问题讨论】:

  • 你应该在你的脑海(或纸上)中想象一个三角形在缩放和旋转之后在哪里(它的坐标),从你用lookAt设置的相机来看。我猜你会看到背面。注意 z 坐标将

标签: c++ opengl glfw


【解决方案1】:

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

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

【讨论】:

  • 只是我的模型的 z 坐标有误,没有意识到 -z 远离相机并且正在存储顶点,就好像更远的是 +z。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 2019-01-09
  • 2020-02-23
  • 2012-05-08
  • 2021-10-01
  • 2011-03-09
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多