2012-12-19 31 views
5

Tôi chắc chắn rằng mọi thứ được liên kết chính xác. Ban đầu tôi đã sử dụng glload và glfw từ GLSDK không chính thức nhưng sau đó tôi quyết định loại bỏ glload có nghĩa là tôi phải sử dụng glew để có được các tiêu đề hiện đại.Vi phạm truy cập. khi sử dụng GLEW và GLFW

#include <GL/glew.h> 
#include <GL/glfw.h> 

Tôi đã bao gồm glew trước khi glfw theo hướng dẫn.

Trong thời gian chạy cửa sổ OpenGL mở

//(relevant code) 
if(!glewInit()) {return -1; } 
if(!glfwInit()) {return -1; } 
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); 
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); 
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
// also tried glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); 

if(!glfwOpenWindow(1024, 768, 8, 8, 8, 8, 24, 8, GLFW_WINDOW)){ 
    glfwTerminate(); 
    return -1; 
} 

glfwSetWindowTitle("OpenGL 3.2"); 

//init method 
glGenVertexArrays(1, &vao); //<< Access violation here. 

Bất cứ ý tưởng gì vấn đề của tôi là ở đây?

Tôi đã xem xét. "Truy cập vi phạm bằng cách sử dụng VBO với glew" Nhưng nó đã không giúp đỡ.

Trả lời

6

glewInit sẽ được gọi là sau ngữ cảnh OpenGL đã được tạo và liên kết với chuỗi chủ đề, ví dụ: sau glfwOpenWindow trong trường hợp của bạn.

+0

Cảm ơn bạn Tôi đã di chuyển như bạn đã nói. if (! glewInit()) {return -1; } là không chính xác để tôi cần phải kiểm tra giá trị nó trả về. vì nó không phải là một bool – Andrew

3

Một chút trễ, nhưng tôi nghĩ rằng tôi sẽ hút đường ống.

Như đã đề cập bởi datenwolf, trong mã có liên quan của bạn, hãy đăng glewInit() sẽ trả về lỗi do vị trí của nó.

Sự cố tiềm ẩn khác mà bạn có thể gặp phải được mô tả trên http://www.opengl.org/wiki/OpenGL_Loading_Library trong phần GLEW.

copy-paste từ trên cao:

GLEW có một vấn đề với bối cảnh lõi. Gọi số glGetString(GL_EXTENSIONS), gây ra GL_INVALID_ENUM trên ngữ cảnh GL 3.2+ ngay sau khi gọi glewInit().

Giải pháp cho GLEW (cũng được cung cấp bởi liên kết ở trên) là bật hỗ trợ 'EXPERIMENTAL'. Ví dụ:

glewExperimental = GL_TRUE; 
GLenum err = glewInit(); 
if(err != GLEW_OK) 
{ 
    printf("GlewInit error"); 
    exit(1); 
} 
2

Cũng muộn nhưng đối với bất cứ ai vẫn nhìn

glewExperimental = GL_TRUE; 

Trước khi khởi tạo bối cảnh được đã thoát khỏi các lỗi vi phạm truy cập, nhưng thay vì làm lối ra chương trình với một lỗi GL_INVALID_ENUM. Với GLFW, tôi phải bổ sung thêm ý kiến ​​gợi ý của cửa sổ:

//glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); 
//glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); 
//glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
//glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); 

Sau đó, chương trình bắt đầu biên dịch!

Các vấn đề liên quan