即使 GLEW 已正确初始化,绘制调用也会发生读取访问冲突
Read access violation on draw calls even though GLEW is initialized properly
我正在使用 GLEW 和 GLFW,但我反复收到此错误:
Exception thrown at 0x0819FF06 in GLTest.exe: 0xC0000005: Access violation reading location 0x00000000.
我很确定我已经正确初始化了 GLEW(当大多数人遇到这个错误时,这似乎是错误的)。
bool Game_Window::CreateWindow()
{
if (glfwInit() != true)
return false;
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
m_window = glfwCreateWindow(m_width, m_height, m_title, NULL, NULL);
glfwMakeContextCurrent(m_window);
glewExperimental = true;
if (glewInit() != GLEW_OK)
return false;
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
std::cout << glGetString(GL_VERSION) << std::endl;
return true;
}
这是我用来绘制它的代码:
#include "Game_Window.h"
#include "Shader.h"
float verticies[] =
{
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.0f,0.5f,0.0f,
};
GLuint indecies[] =
{
0,1,2,
};
int main()
{
Game_Window window("Window", 1600, 900);
if (window.CreateWindow())
{
Shader shader("basic.vert", "basic.frag");
shader.CreateShader();
shader.Use();
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(VBO, sizeof(verticies), verticies, GL_STATIC_DRAW);
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indecies), indecies, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float),
(void*)0);
glEnableVertexAttribArray(0);
while (window.ShouldStayOpen())
{
window.Update();
window.clear();
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
window.swapBuffers();
}
}
return 0;
}
我对这个错误感到很困惑,因为它似乎也发生在随机 glfw 函数上(但我不确定,因为我无法让它始终如一地发生)。在我添加之前我没有收到任何错误:
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
glBufferData
的第一个参数必须是 target 枚举常量(例如 GL_ARRAY_BUFFER
),而不是命名的缓冲区对象。
像这样更改您的代码以解决问题:
glBufferData(
GL_ARRAY_BUFFER, // GL_ARRAY_BUFFER instead of VBO
sizeof(verticies), verticies, GL_STATIC_DRAW);
请注意,如果您要检查 OpenGL 错误 (glGetError
),那么在这种情况下您会得到 GL_INVALID_ENUM
错误。
我正在使用 GLEW 和 GLFW,但我反复收到此错误:
Exception thrown at 0x0819FF06 in GLTest.exe: 0xC0000005: Access violation reading location 0x00000000.
我很确定我已经正确初始化了 GLEW(当大多数人遇到这个错误时,这似乎是错误的)。
bool Game_Window::CreateWindow()
{
if (glfwInit() != true)
return false;
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
m_window = glfwCreateWindow(m_width, m_height, m_title, NULL, NULL);
glfwMakeContextCurrent(m_window);
glewExperimental = true;
if (glewInit() != GLEW_OK)
return false;
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
std::cout << glGetString(GL_VERSION) << std::endl;
return true;
}
这是我用来绘制它的代码:
#include "Game_Window.h"
#include "Shader.h"
float verticies[] =
{
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.0f,0.5f,0.0f,
};
GLuint indecies[] =
{
0,1,2,
};
int main()
{
Game_Window window("Window", 1600, 900);
if (window.CreateWindow())
{
Shader shader("basic.vert", "basic.frag");
shader.CreateShader();
shader.Use();
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(VBO, sizeof(verticies), verticies, GL_STATIC_DRAW);
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indecies), indecies, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float),
(void*)0);
glEnableVertexAttribArray(0);
while (window.ShouldStayOpen())
{
window.Update();
window.clear();
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
window.swapBuffers();
}
}
return 0;
}
我对这个错误感到很困惑,因为它似乎也发生在随机 glfw 函数上(但我不确定,因为我无法让它始终如一地发生)。在我添加之前我没有收到任何错误:
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
glBufferData
的第一个参数必须是 target 枚举常量(例如 GL_ARRAY_BUFFER
),而不是命名的缓冲区对象。
像这样更改您的代码以解决问题:
glBufferData(
GL_ARRAY_BUFFER, // GL_ARRAY_BUFFER instead of VBO
sizeof(verticies), verticies, GL_STATIC_DRAW);
请注意,如果您要检查 OpenGL 错误 (glGetError
),那么在这种情况下您会得到 GL_INVALID_ENUM
错误。