opengl SDL_GL_SwapWindow()抛出异常,0x00007FF9C6E74A40(nvoglv64.dll)为0x0000000000000

9ceoxa92  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(191)

我正在尝试将一个简单的四边形渲染到屏幕上:

  1. #include <SDL.h>
  2. #include <GL/glew.h>
  3. #include <SDL_opengl.h>
  4. #include <iostream>
  5. const int SCREEN_WIDTH = 640;
  6. const int SCREEN_HEIGHT = 480;
  7. int mouse_x, mouse_y;
  8. SDL_Window* window = NULL;
  9. SDL_Renderer* renderer = NULL;
  10. SDL_GLContext context = NULL;
  11. const char* vertexShaderSource =
  12. "#version 460\n"
  13. "layout(location = 0) in vec3 aPos;\n"
  14. "void main(){\n"
  15. " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
  16. "}\n";
  17. const char* fragmentShaderSource =
  18. "#version 460\n"
  19. "out vec4 FragColor;\n"
  20. "void main(){\n"
  21. " FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
  22. "}\n";
  23. int main(int argv, char* argc[])
  24. {
  25. SDL_Init(SDL_INIT_EVERYTHING);
  26. SDL_Init(SDL_VIDEO_OPENGL);
  27. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
  28. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
  29. SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  30. window = SDL_CreateWindow("SDL Julia Set Renderer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL);
  31. context = SDL_GL_CreateContext(window);
  32. glewInit();
  33. glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
  34. unsigned int vertexShader;
  35. vertexShader = glCreateShader(GL_VERTEX_SHADER);
  36. glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
  37. glCompileShader(vertexShader);
  38. int success;
  39. char infoLog[512];
  40. glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
  41. if (!success)
  42. {
  43. glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
  44. std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
  45. }
  46. unsigned int fragmentShader;
  47. fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  48. glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
  49. glCompileShader(fragmentShader);
  50. glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
  51. if (!success)
  52. {
  53. glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
  54. std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
  55. }
  56. unsigned int shaderProgram;
  57. shaderProgram = glCreateProgram();
  58. glAttachShader(shaderProgram, vertexShader);
  59. glAttachShader(shaderProgram, fragmentShader);
  60. glLinkProgram(shaderProgram);
  61. glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
  62. if (!success) {
  63. glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
  64. std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
  65. }
  66. glDeleteShader(vertexShader);
  67. glDeleteShader(fragmentShader);
  68. float verts[] =
  69. {
  70. -0.5f, -0.5f, 0.0f,
  71. 0.5f, -0.5f, 0.0f,
  72. 0.5f, 0.5f, 0.0f,
  73. -0.5f, 0.5f, 0.0f
  74. };
  75. int indices[] =
  76. {
  77. 0, 1, 3,
  78. 1, 2, 3
  79. };
  80. unsigned int VBO, VAO, EBO;
  81. glGenVertexArrays(1, &VAO);
  82. glGenBuffers(1, &EBO);
  83. glGenBuffers(1, &VBO);
  84. glBindVertexArray(VAO);
  85. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  86. glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
  87. glBindBuffer(GL_ARRAY_BUFFER, EBO);
  88. glBufferData(GL_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  89. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
  90. glEnableVertexAttribArray(0);
  91. bool isrunning = true;
  92. while (isrunning)
  93. {
  94. SDL_Event event;
  95. while (SDL_PollEvent(&event))
  96. {
  97. if (event.type == SDL_QUIT)
  98. {
  99. isrunning = false;
  100. }
  101. }
  102. //Main Loop
  103. SDL_GetMouseState(&mouse_x, &mouse_y);
  104. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  105. glClear(GL_COLOR_BUFFER_BIT);
  106. glUseProgram(shaderProgram);
  107. glBindVertexArray(VAO);
  108. //glDrawArrays(GL_TRIANGLES, 0, 3);
  109. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
  110. /*
  111. Here's where the error took place
  112. */
  113. SDL_GL_SwapWindow(window);
  114. }
  115. glDeleteVertexArrays(1, &VAO);
  116. glDeleteBuffers(1, &VBO);
  117. glDeleteProgram(shaderProgram);
  118. SDL_Quit();
  119. return 0;
  120. }

字符串
.然而,我的代码一直在SDL_GL_SwapWindow(window)中抛出错误:

  1. Exception thrown at 0x00007FF9C6E74A40 (nvoglv64.dll) in SDL Julia Set Renderer.exe: 0xC0000005: Access violation reading location 0x0000000000000000.


这个错误只是在我为EBO编写代码之后才开始出现的,所以我假设我在那里做错了什么。
我尝试更新我的NVIDIA驱动程序。

30byixjq

30byixjq1#

在 VAO 设置过程中,您需要小心将哪个缓冲区绑定到哪个绑定点。glVertexAttribPointer对当前绑定到GL_ARRAY_BUFFER的缓冲区进行操作,但由于您还将EBO绑定到该绑定点,因此现在您将在EBO和顶点属性之间建立连接。通常,EBO需要绑定到GL_ELEMENT_ARRAY_BUFFER。更正后的代码应如下所示:

  1. glBindVertexArray(VAO);
  2. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  3. glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
  4. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
  5. glEnableVertexAttribArray(0);
  6. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  7. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

字符串

相关问题