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 社区中获取访问冲突异常