GLFW/GLEW C++ (atioglxx.dll)
GLFW/GLEW C++ (atioglxx.dll)
所以...
在过去的几天里,我一直在使用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
对象时。发生这种情况时,存储的指针指向无效的内存地址。
例如,若要解决此问题,可以存储字符串对象本身而不是指针。但是为了更好的设计,我建议无论如何都要避免使用全局变量。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- C++ ATIOGLXX.pdb 包含查找模块 ATIOGLXX.dll 源代码所需的调试信息
- GLFW/GLEW C++ (atioglxx.dll)