GLFW/GLEW C++ (atioglxx.dll)

Posted

技术标签:

【中文标题】GLFW/GLEW C++ (atioglxx.dll)【英文标题】: 【发布时间】:2016-01-17 13:31:47 【问题描述】:

所以...

在过去的几天里,我一直在使用 GLFW 和 GLEW 编写 OpenGL 程序,直到今天,一切都大部分正常。我的程序崩溃了,并告诉我存在“访问冲突”:

OpenGLProject.exe 中 0x549E12F0 (atioglxx.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x28F98511。

OpenGLProject.exe 中 0x549E12F0 (atioglxx.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x28F98511。

程序“[7712] OpenGLProject.exe”已退出,代码为 0 (0x0)。

我在谷歌上搜索了很多答案,或者至少是类似的答案,但无济于事。我不认为问题出在我的驱动程序上,但很可能是。但我相信这只是我糟糕的编程问题。

main.cpp:

#define UTIL_HEAD
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <math.h>

#define GL_HEAD
    #define GLEW_STATIC
    #include <glew.h>
    #include <glfw3.h>

#include "shaders.h"

const GLuint width = 800, height = 600;
GLuint renderer;

int kill() 
    std::cout << "Stopping!";

    //glDeleteVertexArrays();
    //glDeleteProgram();
    //glDeleteVertexArrays();

    glfwTerminate();
    return -1;


void windowInit() 
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);


void shaderInit() 
    renderer = compileShaders();
    GLuint vao;

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);


void renderInit() 
    const GLfloat color[] =  (float)sin(glfwGetTime()) * 0.5f + 0.5f,
                              (float)cos(glfwGetTime()) * 0.5f + 0.5f,
                              0.0f, 1.0f ;

    glClearBufferfv(GL_COLOR, 0, color);


int main() 

    windowInit();

    GLFWwindow * window = glfwCreateWindow(width, height, "Test", nullptr, nullptr);

    if (window == nullptr) 
        std::cout << "Failed to create GLFW window" << std::endl;
        kill();
    
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) 
        std::cout << "Failed to initialize GLEW" << std::endl;
        kill();
    

    shaderInit();

    glViewport(0, 0, width, height);

    while (!glfwWindowShouldClose(window)) 
        glfwPollEvents();
        renderInit();
        glUseProgram(renderer);
        glDrawArrays(GL_POINTS, 0, 1);
        glfwSwapBuffers(window);
    
    kill();
    return 0;

#ifndef UTIL_HEAD
    #define UTIL_HEAD
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <math.h>
#endif

Shader.hpp:

#ifndef UTIL_HEAD
    #define UTIL_HEAD
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <math.h>
#endif

#ifndef GL_HEAD
    #define GL_HEAD
    #define GLEW_STATIC
    #include <glew.h>
    #include <glfw3.h>
#endif

const char * fragment_shader_source;
const char * vertex_shader_source;

void loadVertexShader() 

    std::ifstream vertex("./shader_vtex.glsl");
    std::string vertex_shader_read;

    std::string vline;
    if (vertex.is_open()) 
        while (std::getline(vertex, vline)) 
            vertex_shader_read = vertex_shader_read + vline + '\n';
        
        vertex.close();
    
    else 
        std::cout << "error: (critical) unable to open vertex shader!" << '\n';
    
    vertex_shader_source = vertex_shader_read.c_str();


void loadFragmentShader() 

    std::ifstream fragment("./shader_frag.glsl");
    std::string fragment_shader_read;

    std::string fline;
    if (fragment.is_open()) 
        while (std::getline(fragment, fline)) 
            fragment_shader_read = fragment_shader_read + fline + '\n';
        
        fragment.close();
    
    else 
        std::cout << "error: (critical) unable to open fragment shader!" << '\n';
    
    fragment_shader_source = fragment_shader_read.c_str();


GLuint compileShaders() 

    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;

    loadVertexShader();
    loadFragmentShader();

    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, (const GLchar**)vertex_shader_source, NULL);
    glCompileShader(vertex_shader);

    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vertex_shader, 1, (const GLchar**)fragment_shader_source, NULL);
    glCompileShader(fragment_shader);

    program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);

    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);

    return program;

您可以在GitHub.找到此项目的其他代码(着色器等)

提前感谢您提供的任何帮助!

【问题讨论】:

while (std::getline(vertex, vline)) 呃。为什么人们在加载文件时会这样做?他们真的认为这是加载整个文件的好方法吗?对它进行谷歌搜索;你会发现plenty of alternatives,甚至在这个网站上。 对不起...我对 C++ 比较陌生,这是我想到的读取文件的唯一方法。我会想出一个更好的解决方案! 【参考方案1】:

着色器加载存在问题:您只存储了.cstr() 指针而不是字符串对象。当loadVertexShader 方法(或loadFragmentShader 方法)超出范围并删除vertex_shader_read 对象时。发生这种情况时,存储的指针指向无效的内存地址。

要解决此问题,例如,您可以存储字符串对象本身而不是指针。但为了更好的设计,我建议无论如何都要避免使用全局变量。

【讨论】:

旁注:这段代码中实际上绑定了一个VAO(在shaderInit()中)。 好的。我将这两个函数的内容移到了 compileShaders() 的主体中,因为它们只被调用了一次,并且它消除了对全局变量的使用。但我似乎仍然无法弄清楚如何获取指针指向的变量的值,而不会导致变量死亡并随身携带指针。有什么建议吗?

以上是关于GLFW/GLEW C++ (atioglxx.dll)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW

使用 GLFW + GLEW 时 glGenFramebuffers() 访问冲突

使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常

glfw 包含了opengl吗

opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明

OpenGL01 搭建opgl环境