GLFW/GLEW C++ (atioglxx.dll)

GLFW/GLEW C++ (atioglxx.dll)

本文关键字:atioglxx dll C++ GLEW GLFW      更新时间:2023-10-16

所以...

在过去的几天里,我一直在使用GLFW和GLEW编写OpenGL程序,直到今天,一切都很顺利。我的程序只是崩溃并告诉我存在"访问冲突":

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

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

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

我已经在谷歌上搜索了很多答案,或者至少是类似的东西,但无济于事。我不认为问题出在我的司机身上,但很可能是。但我相信这里的问题只是我糟糕的编程。

主.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 上找到此项目的其他代码(着色器等)。

提前感谢您给予的任何帮助!

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

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