GLM 不断提供断断续续的转换和轮换

GLM Keeps Providing Choppy Transformation and Rotations

本文关键字:转换 断断续续 GLM      更新时间:2023-10-16

我目前遇到了 GLM 提供断断续续的转换和旋转的问题。我的意思是它们并不顺利。我正在使用GLFW 3,GLM和OpenGL 3.2。我正在尝试使用操纵杆输入转换一个简单的四边形。起初,我认为问题是由操纵杆引起的。为了反驳这一点,我更改了代码以独立于用户输入旋转四边形,但依赖于 deltaTime。下面是一些代码段。我假设这与我如何旋转矩阵有关?

CPP 文件:

float speed = 3.0f;
float deadZone = 0.10f;
glm::vec2 direction(0.0f);
while (!glfwWindowShouldClose(window))
{
    currentTime = glfwGetTime();
    deltaTime = (currentTime - lastUpdate) * 1000.0f;
    //Update logic
    inputHandler->tick(deltaTime);
    float inputX, inputY;
    inputX = inputHandler->getGamepad(0)->getAxes(AXIS::HORIZONTAL);
    inputY = inputHandler->getGamepad(0)->getAxes(AXIS::VERTICAL);
    float magnitude = sqrtf((inputX * inputX) + (inputY * inputY));
    if (magnitude > deadZone) //Radial dead zone detection
    {
        //Could the stutter be caused by type casting?
        direction.x += inputX * float((speed * deltaTime) / 1000.0f);
        direction.y += inputY * float((speed * deltaTime) / 1000.0f);
    }
    ... //Set vertex values and UV coord
    //Set the matrix values according to the joystick input
    glm::mat4 MVP(1.0f);
    MVP = glm::translate(MVP, glm::vec3(direction, 0.0f));
    glUniformMatrix4fv(mvpID, 1, GL_FALSE, glm::value_ptr(MVP));
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    ...
}

顶点着色器:

#version 150
in vec2 vertexPosition_modelspace;
in vec2 UV;
uniform mat4 MVP;
out vec2 vUV;
void main() {
    vUV = UV;
    gl_Position = MVP * vec4(vertexPosition_modelspace, 0, 1);
}

这里有一些调试帮助,以免被埋没在评论中:

  • 记录每帧的时间步长

  • 当时间步长超过您确定足以导致"跳转"的某个给定阈值时,请暂停程序。

  • 如果错误来自大时间步长,请跟踪哪些函数花费了多少时间,并查看是否有任何函数花费了异常的时间。

    我。如果您有探查器,请在此处使用它。

    ii. 如果没有,请记录每个功能前后的时间并计算持续时间。在每帧结束时汇总这些时间步长,以便您仍然可以找到指示跳转的总增量时间。

  • 如果你把你的错误追溯到一些你无法控制的库/系统/其他调用,请确保你传递了这些函数(实际上是所有函数)良好的数据。

    我。您是否在某处使用损坏的内存而侥幸逃脱?

    ii. 错误只适用于轮换吗?翻译/比例呢?

    iii. 如果您只是通过尝试 OpenGL 操作来运行程序,是否会发生此错误?这可能是您的窗口错误,您错过了一些更新调用或类似琐碎的事情。

这非常令人沮丧,但我重新启动了Windows,所有的问题都消失了。即使是对std::cout的调用导致Visual Studio插入断点。

看起来glfwGetTime使用QueryPerformanceCounter .这不是用于计时的正确 API,因为它测量的是"CPU 时间"而不是"挂墙时间"。它应该用于测量代码性能,但不能用于测量其他内容。您应该使用 Windows 多媒体计时器 API 中的 timeGetTime()timeBeginPeriod()timeEndPeriod()编写自己的计时器类:http://msdn.microsoft.com/en-us/library/windows/desktop/dd743609(v=vs.85).aspx