OpenGL - 在 NDC 中计算位置在着色器中有效但在 'regular' 程序中无效

OpenGL - calculating position in NDC works in shader but not in 'regular' program

我目前正在使用 opengl 开发 2d-sicescrolling jump'n'运行。我目前想检查我的敌人是否在屏幕上呈现,以停止对不可见的敌人进行碰撞计算。为此,如果 NDC 中的位置在 x 轴和 y 轴的 [-1, 1] 之间,我会检查每一帧。 这是通过以下方法完成的:

bool Enemy::checkWithCameraArea(glm::mat4 cameraView, glm::mat4 proj, glm::vec3 scale) {
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::translate(model, position);
    model = glm::scale(model, scale);
    glm::vec4 posInClip = proj * cameraView * model * glm::vec4(position, 1.0f);
    glm::vec3 posDehom = glm::vec3(posInClip.x / posInClip.w, posInClip.y / posInClip.w, posInClip.z / posInClip.w);

    if (posDehom.x <= 1.0f && posDehom.x >= -1.0f &&
        posDehom.y <= 1.0f && posDehom.y >= -1.0f) {
        return true;
    }

    return false;
}

视图矩阵是这样计算的:glm::lookAt(_position, _position + _front, _up); 和这样的投影矩阵:glm::perspective(45.0f, (float)Width / (float)Height, 5.0f, 15.0f); 这些值根据相机向右移动更新每一帧。

在我的顶点着色器中使用相同的值将位置转换为剪辑 space,从渲染的角度来看一切正常。但对每个敌人的计算似乎只在开始时有效。如果相机向右移动,则由我的“checkWithCameraArea”方法计算的区域似乎会滞后。所以左边出屏幕的敌人还在计算,右边进入屏幕的敌人还没有计算。请帮助我,我不知道我的错误在哪里。

编辑 #1

删除了带有缩放的行,因为这对单个位置没有意义(正如评论中指出的那样)。因为有人问,我检查的位置是左下角。但是当整个对象都在屏幕上时,我的问题仍然存在,可以看到here。在这个视频中,我想象了这个问题:checkWithCameraArea-Method 的结果决定了敌人纹理(真)还是那个绿框(假)被绘制

正如用户 BDL 在评论中指出的那样,我应用了两次位置(一次在翻译中,一次在与 MVP 相乘时)。我还删除了缩放比例,因为它对于单个点来说不是必需的。 该方法现在看起来像这样并按我想要的方式工作:

bool Enemy::checkWithCameraArea(glm::mat4 view, glm::mat4 proj) {
    glm::vec4 posInClip = proj * view * glm::vec4(position, 1.0f);
    glm::vec3 posDehom = glm::vec3(posInClip.x / posInClip.w, posInClip.y / posInClip.w, posInClip.z / posInClip.w);

    if (posDehom.x <= 1.0f && posDehom.x >= -1.0f &&
        posDehom.y <= 1.0f && posDehom.y >= -1.0f) {
        return true;
    }

    return false;
}