【发布时间】: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 坐标将