我正在使用GLFW
和GLEW
。
但在初始化期间,我的对象glGenBuffers
会抛出异常
void Character::init2D(glm::vec3 top, glm::vec3 bottom_left, glm::vec3 bottom_right)
{
glm::vec3 Vertices[3];
Vertices[0] = bottom_left;
Vertices[1] = top;
Vertices[2] = bottom_right;
this->top = top;
this->left_front = bottom_left;
this->right_front = bottom_right;
glGenBuffers(1, &VBO); //throws an exception 0xC0000005: Access violation
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
CompileShaders(shaderProgram, "vertex.shader", "fragment.shader");
}
我声明我的班级Character
就像这样
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp>
#pragma comment(lib, "glfw3.lib")
#pragma comment(lib, "glew32.lib")
class Character
{
private:
glm::vec3 top,
left_front,
right_front,
left_back,
right_back;
GLuint VBO;
GLuint shaderProgram;
public:
Character();
void init2D(glm::vec3 top,
glm::vec3 bottom_left,
glm::vec3 bottom_right);
void draw();
void move();
void action();
~Character() {};
};
我的main.cpp
看起来像这样
#include <iostream>
#include "character.h"
#define WIDTH 600
#define HEIGHT 600
using namespace std;
Character simple;
void render()
{
simple.draw();
}
int main(int argc, char** argv)
{
GLFWwindow *window;
if (!glewInit())
exit(EXIT_FAILURE);
if (!glfwInit())
exit(EXIT_FAILURE);
window = glfwCreateWindow(WIDTH, HEIGHT, "Imensia", NULL, NULL);
if (!window) { glfwTerminate(); exit(EXIT_FAILURE); }
glm::vec3 left(-0.5, 0, 0);
glm::vec3 top(0, 0.5, 0);
glm::vec3 right(0.5, 0, 0);
simple.init2D(top, left, right);
glfwMakeContextCurrent(window);
while(!glfwWindowShouldClose(window))
{
glViewport(0, 0, WIDTH, HEIGHT);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
render();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
};
初始化或者什么问题?
在项目的properties
中,我设置了include
和library
目录...
答案 0 :(得分:3)
应在创建windows / opengl上下文后进行Glew初始化。
对于给定的代码,glewInit
可以移到glfwCreateWindow
:
int main(int argc, char** argv)
{
GLFWwindow *window;
if (!glfwInit())
exit(EXIT_FAILURE);
window = glfwCreateWindow(WIDTH, HEIGHT, "Imensia", NULL, NULL);
if (!window) { glfwTerminate(); exit(EXIT_FAILURE); }
if (!glewInit())
exit(EXIT_FAILURE);
:
:
}
答案 1 :(得分:0)
Keugyeols的方法帮助我解决了这个问题。如果您遵循glfws文档中提到的教程,则可能会对您有所帮助。
int main(int argc, char** argv){
GLFWwindow* window;
if (!glfwInit()) {
return -1;
}
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if(!glewInit()){
return 0;
}
/*your code
*
*/
}