【问题标题】:openGL: glGenVertexArrays Access violation executing location 0x00000000openGL:glGenVertexArrays 访问冲突执行位置 0x00000000
【发布时间】:2015-07-15 16:29:27
【问题描述】:

我正在尝试自己学习 openGL,所以我买了一本关于 openGL 的书,第一章是示例代码,所以我尝试了一下,但出了点问题。在第 17 行(glGenVertexArrays(NumVAOs, VAOs);) 和 18(glBindVertexArray(VAOs[Triangles]);) 是 VS 2013 Ultimate 准确报告错误“openGL_3.exe 中 0x77350309 处的未处理异常:0xC0000005:访问冲突执行位置 0x00000000。 ”。所以我认为这是记忆有问题,但我不知道是什么。有人能帮我吗?

#include <iostream>
using namespace std;

#include <vgl.h>
#include <LoadShaders.h>


enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;

void init(void)
{
    glGenVertexArrays(NumVAOs, VAOs);
    glBindVertexArray(VAOs[Triangles]);
    GLfloat vertices[NumVertices][2] = {
        { -0.90, -0.90 }, // Triangle 1
        { 0.85, -0.90 },
        { -0.90, 0.85 },
        { 0.90, -0.85 }, // Triangle 2
        { 0.90, 0.90 },
        { -0.85, 0.90 }
    };
    glGenBuffers(NumBuffers, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
    vertices, GL_STATIC_DRAW);
    ShaderInfo shaders[] = {
        { GL_VERTEX_SHADER, "triangles.vert" },
        { GL_FRAGMENT_SHADER, "triangles.frag" },
        { GL_NONE, NULL }
    };
    GLuint program = LoadShaders(shaders);
    glUseProgram(program);
    glVertexAttribPointer(vPosition, 2, GL_FLOAT,
    GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(vPosition);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);
    glFlush();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 3);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
    if (glewInit()) {
        cerr << "Unable to initialize GLEW ... exiting" << endl;
        exit(EXIT_FAILURE);
    }
    init();
    glutDisplayFunc(display);
    glutMainLoop();
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    您可以尝试设置:

    glewExperimental = GL_TRUE;
    

    在您致电 glewInit() 之前。资料来源:

    https://stackoverflow.com/a/20822876/833188

    https://stackoverflow.com/a/22820845/833188

    【讨论】:

      【解决方案2】:

      您确定可以致电glewInit() 之前请求版本4.3?每个版本&gt;= 3.0 都需要WGL_ARB_create_context (Windows)/GLX_ARB_create_context (Linux),这是一个扩展。

      通常,要创建 “现代” OpenGL 上下文 (3.0+),需要:

      1. 创建临时上下文,将其设置为当前上下文。
      2. 初始化扩展(手动或使用 GLEWGLFW 等加载程序)。
      3. 请求所需的版本(和配置文件,如果您创建版本 3.2 或更高版本并且存在 WGL_ARB_create_context_profile/GLX_ARB_create_context_profile)。
      4. 1. 中删除临时上下文并绑定您的新上下文。

      你可能想看看:

      我不知道,在GLUTGLEW 初始化中请求上下文版本之间有什么联系(我经常使用GLEW,但是创建上下文是我总是使用特定于平台的 API 手动执行),但显然,当您调用 glGenVertexArrays 时,指向新 OpenGL API 的指针不会被初始化。这就是您的错误的原因 - 您尝试通过指针调用函数,即 NULL

      【讨论】:

      • freeglut(以及整个glutInitContextVersion API 只是其他 GLUT 版本中不存在的特定于 freeglut 的扩展)将以平台抽象的方式处理上下文创建,就像 GLFW、SDL 或类似的库。除了尝试在核心配置文件中使用 glewInit() 而不使用 glewExperimental=GL_TRUE 之外,这种方法实际上没有任何主要问题。
      【解决方案3】:

      我一般同意 Sga 的回答,建议在调用glewInit() 之前设置glewExperimental=GL_TRUE。如果未设置此选项,GLEW 将无法在核心配置文件中初始化。

      但是,glewInit() 确实没有失败的事实意味着 OP 根本没有获得核心配置文件(或者 GLEW 终于得到修复,但这更多是理论上的可能性)。

      我已经针对问题“Where is the documentation for glutInitContextVersion?”查看了 freeglut 对(freeglut 特定的)glutInitContextVersion API 的实现,当时的结论在这种情况下可能会有所帮助。引用我自己的话:

      通过查看代码(对于当前的稳定版本 2.8.1),一个 将看到 freeglut 实现了以下逻辑:如果 实现不能满足版本约束,但确实 支持 ARB_create_context 扩展,它会产生一些错误 并且不会创建上下文。但是,如果需要版本, 但是实现甚至不支持相关的扩展, 创建了旧的 GL 上下文,有效地忽略了版本 完全请求。

      所以根据报告的行为,我推断 OP 确实只获得了一个遗留上下文,甚至可能是微软默认的 OpenGL 1.1 实现。

      这也解释了为什么 glGenVertexArrays() 即使在 glewInit() 成功之后也是一个 NULL 指针:此上下文不支持扩展。

      您应该检查glGetString(GL_VERSION)glGetString(GL_RENDERER)glutCreateWindow() 调用之后实际返回的内容。根据输出,您可能会考虑检查/更新您的图形驱动程序,或者您可能会发现您的 GPU 根本不支持现代 GL。

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 1970-01-01
        • 2023-03-23
        • 2013-04-15
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多