如何解决未处理的异常?(GLFW3 OpenGL)

How to resolve unhandled exception? (OpenGL, GLFW3)

本文关键字:异常 GLFW3 OpenGL 未处理 解决 何解决      更新时间:2023-10-16

异常显示:

Foundry.exe中0x00F52157的未处理异常:0xC0000005:访问冲突读取位置0x00000030.

并指向controls.cpp:

中的这一行
glfwGetCursorPos(window, &xpos, &ypos);

控制代码在单独的文件Controls .cpp:

#include "stdafx.h"
#include <GLFW/glfw3.h>
extern GLFWwindow* window;
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
using namespace glm;
#include "controls.hpp"
glm::mat4 ViewMatrix;
glm::mat4 ProjectionMatrix;
glm::mat4 getViewMatrix(){
return ViewMatrix;
}
glm::mat4 getProjectionMatrix(){
return ProjectionMatrix;
}
glm::vec3 position = glm::vec3( 0, 0, 5 ); 
float horizontalAngle = 3.14f;
float verticalAngle = 0.0f;
float initialFoV = 45.0f;
float speed = 3.0f;
float mouseSpeed = 0.005f;

void computeMatricesFromInputs(){
  static double lastTime = glfwGetTime();
  double currentTime = glfwGetTime();
  float deltaTime = float(currentTime - lastTime);
  double  xpos;
  double    ypos;
  glfwGetCursorPos(window, &xpos, &ypos);
  glfwSetCursorPos(window, 1280/2, 1024/2);
  horizontalAngle += mouseSpeed * float (1280/2 - xpos );
  verticalAngle   += mouseSpeed * float (1024/2 - ypos );
  glm::vec3 direction(
    cos(verticalAngle) * sin(horizontalAngle), 
    sin(verticalAngle),
    cos(verticalAngle) * cos(horizontalAngle)
  );
  glm::vec3 right = glm::vec3(
    sin(horizontalAngle - 3.14f/2.0f), 
    0,
    cos(horizontalAngle - 3.14f/2.0f)
  );
  glm::vec3 up = glm::cross( right, direction );
  if (glfwGetKey( window, GLFW_KEY_UP || GLFW_KEY_W ) == GLFW_PRESS){
    position += direction * deltaTime * speed;
  }
  if (glfwGetKey( window, GLFW_KEY_DOWN || GLFW_KEY_S ) == GLFW_PRESS){
    position -= direction * deltaTime * speed;
  }
  if (glfwGetKey( window, GLFW_KEY_RIGHT || GLFW_KEY_D ) == GLFW_PRESS){
    position += right * deltaTime * speed;
  }
  if (glfwGetKey( window, GLFW_KEY_LEFT || GLFW_KEY_A ) == GLFW_PRESS){
    position -= right * deltaTime * speed;
  }
  float FoV = initialFoV;
  ProjectionMatrix = glm::perspective(FoV, 5.0f / 4.0f, 0.1f, 100.0f);
  ViewMatrix       = glm::lookAt(position,position+direction,up);
  lastTime = currentTime;
}

程序运行良好,不需要通过输入控件修改矩阵。

老实说,我不太了解底层编程和内存分配,所以这可能是原因。

这是内存访问冲突,而不是异常。

计算矩阵时,window可能是坏指针。代码中的某个地方是glfwCreateWindow()分配给window的结果。是在计算矩阵之前完成的吗?这个结果是不是没有NULL值?在你的代码中可能有glfwDestroyWindow(window);。如果是这样,是在计算矩阵之后完成的吗?