我目前在Windows 8上有一些與OpenGL開發有關的問題。我正在爲在Linux中工作的項目設置OpenGL。未處理的異常,glGenVertexArrays中的訪問衝突調用
我們在這個項目中同時使用glfw和glew。
我實際的問題是,glGenVertexArrays爲空,當它被稱爲它崩潰,我得到一個訪問衝突。 glGenVertexArrays不是使用被稱爲glew的第一個gl調用。
我聯繫GLEW和使用按照本教程的win32庫GLFW到Visual Studio項目:http://www.41post.com/5178/programming/opengl-configuring-glfw-and-glew-in-visual-cplusplus-express
下面的代碼是初始化代碼:
glfwSetErrorCallback(error_callback);
if (!glfwInit())
{
LOG_FATAL << "Failed to init glfw context";
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
m_window = glfwCreateWindow(1240, 480, "Rubix", NULL, NULL);
if (!m_window)
{
glfwTerminate();
LOG_FATAL << "Failed to create glfw window";
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(m_window);
#ifdef WIN32
//glewExperimental = GL_TRUE;
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK)
{
std::cout << "Glew not okay! " << glewinit;
exit(EXIT_FAILURE);
}
#endif
glfwSwapInterval(1);
glfwSetKeyCallback(m_window, key_callback);
LOG_INFO << "glfw OpenGL context ready";
initGL();
下面的代碼被稱爲顯示立方體:
float points[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
float normals[] = {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 1.0f, 1.0f
};
unsigned short index_array[] = {
0, 3, 2,
0, 2, 1,
0, 1, 5,
0, 5, 4,
1, 2, 6,
1, 6, 5,
2, 3, 7,
2, 7, 6,
3, 0, 4,
3, 4, 7,
4, 5, 6,
4, 6, 7,
};
GLuint points_vbo;
glGenBuffers (1, &points_vbo);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), points, GL_STATIC_DRAW);
GLuint normals_vbo;
glGenBuffers (1, &normals_vbo);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glBufferData (GL_ARRAY_BUFFER, 32 * sizeof (float), normals, GL_STATIC_DRAW);
GLuint index_buffer_object;
glGenBuffers (1, &index_buffer_object);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, 48 * sizeof (unsigned short), index_array, GL_STATIC_DRAW);
glGenVertexArrays (1, &m_vao);
glBindVertexArray (m_vao);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer (GL_ARRAY_BUFFER, normals_vbo);
glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_object);
glBindVertexArray(0);
// Creating program
Program program;
program.emplace_back("pos.vert", GL_VERTEX_SHADER);
program.emplace_back("smooth.frag", GL_FRAGMENT_SHADER);
program.link();
program.clearShaders();
m_program = program.getProgram();
我嘗試過glewExperimental = GL_TRUE;用這個代碼運行,但它不顯示任何東西。
我使用的GPU是nvidia GT 730M,它支持opengl 4.2。
我也跑了glewinfo.exe,說glGenVertexArrays應該是好的。 另外我注意到,當我打開位於Windows套件下的gl文件夾下的glcorearb.h位置(使用visual studio 2013)時,opengl中的大多數版本都灰顯,我認爲問題可能與此有關。
我已經通過Nvidia的工具GeForce Experience安裝了我的驅動程序。他們是我的GPU的最新驅動程序。 –
我只是測試和glGetString(GL_VENDOR);」返回儘管我確實改變在NVIDIA控制面板中的設置實際使用它,而不是英特爾集成GPU ...... –
英特爾,我在NVIDIA的控制面板設置是爲釋放.exe,我用debug .exe進行了測試。我在配置文件中添加了debug .exe,並且仍然崩潰。 –