GLM 不断提供断断续续的转换和轮换
GLM Keeps Providing Choppy Transformation and Rotations
我目前遇到了 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
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- GLM 不断提供断断续续的转换和轮换