所以...
在过去的几天里,我一直在使用 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/