c++ - GLFW/GLEW C++ (atioglxx.dll)

标签 c++ opengl dll glfw glew

所以...

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

First-chance exception at 0x549E12F0 (atioglxx.dll) in OpenGLProject.exe: 0xC0000005: Access violation reading location 0x28F98511.

Unhandled exception at 0x549E12F0 (atioglxx.dll) in OpenGLProject.exe: 0xC0000005: Access violation reading location 0x28F98511.

The program '[7712] OpenGLProject.exe' has exited with code 0 (0x0).

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

主要.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

着色器.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 对象将被删除。发生这种情况时,存储的指针指向无效的内存地址。

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

关于c++ - GLFW/GLEW C++ (atioglxx.dll),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838871/

相关文章:

c++ - 在 C++ 中更改函数实现

c++ - C++为什么new关键字有效而malloc无效?

java - 阴影体积实现

c++ - 无法使用FBO绘制多个元素

C++ DLL 字符参数

c++ - ARM Linux 中的队列库

c++ - volatile 和 virtual 成员如何影响 C++ 合成移动构造函数?

c++ - openGL 奇怪的错误?

c++ - Dll 与静态库(MSVC9 运行时库选项)

c++ - FindResourceW() 返回错误代码 127