C++ OpenGL,访问冲突

C++ OpenGL,访问冲突,c++,opengl,access-violation,C++,Opengl,Access Violation,我正在VisualStudio2010中制作一个OpenGL项目。我正在关注youtube上的教程。我不知道错误在哪里,我有一个错误: Unhandled exception at 0x00000000 in OpenGL First Game.exe: 0xC0000005: Access violation. Main.cpp #include <GL/glew.h> #include <iostream> #include <GL/glut.h> #i

我正在VisualStudio2010中制作一个OpenGL项目。我正在关注youtube上的教程。我不知道错误在哪里,我有一个错误:

Unhandled exception at 0x00000000 in OpenGL First Game.exe: 0xC0000005: Access violation.
Main.cpp

#include <GL/glew.h>
#include <iostream>
#include <GL/glut.h>
#include "Sprite.h"

Sprite _sprite;

void Init() {
    glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
    _sprite.Init(-1.0f, -1.0f, 1.0f, 1.0f);
}

void Render() {
    glClearDepth(1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    _sprite.Render();

    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(520, 200);
    glutInitWindowSize(800, 600);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutCreateWindow("OpenGL [ 1 ]");
    glutDisplayFunc(Render);
    Init();
    glutMainLoop();
}
#包括
#包括
#包括
#包括“Sprite.h”
雪碧;
void Init(){
glClearColor(0.0f、1.0f、1.0f、1.0f);
_精灵初始化(-1.0f,-1.0f,1.0f,1.0f);
}
void Render(){
glClearDepth(1.0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
_sprite.Render();
glutSwapBuffers();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_深度| GLUT_双精度| GLUT_RGBA);
位置(520200);
glutInitWindowSize(800600);
glutInitDisplayMode(GLUT_双精度);
glutCreateWindow(“OpenGL[1]”);
glutDisplayFunc(渲染);
Init();
glutMainLoop();
}
雪碧

#include <GL/glew.h>
#include "Sprite.h"

Sprite::Sprite(void){
    _vboID = 0;
}


Sprite::~Sprite(void){
    if(_vboID != 0)
        glDeleteBuffers(1, &_vboID);
}

void Sprite::Init(float x, float y, float width, float height){
    _x = x;
    _y = y;
    _width = width;
    _height = height;

    if(_vboID == 0){
        glGenBuffers(1, &_vboID);
    }

    float VertexData[12];
    // Prvi trougao
    VertexData[0] = x + width;
    VertexData[1] = y + height;
    VertexData[2] = x;
    VertexData[3] = y + height;
    VertexData[4] = x;
    VertexData[5] = y;

    // Drugi trougao
    VertexData[6] = x;
    VertexData[7] = y;
    VertexData[8] = x + width;
    VertexData[9] = y;
    VertexData[10] = x + width;
    VertexData[11] = y + height;

    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData), VertexData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void Sprite::Render(){
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 6);

    glDisableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}
#包括
#包括“Sprite.h”
精灵::精灵(虚空){
_vboID=0;
}
精灵::~精灵(虚空){
如果(_vboID!=0)
glDeleteBuffers(1,&U vboID);
}
void Sprite::Init(浮动x、浮动y、浮动宽度、浮动高度){
_x=x;
_y=y;
_宽度=宽度;
_高度=高度;
如果(_vboID==0){
glGenBuffers(1,&u vboID);
}
浮动顶点数据[12];
//Prvi特鲁加奥酒店
顶点数据[0]=x+宽度;
顶点数据[1]=y+高度;
顶点数据[2]=x;
顶点数据[3]=y+高度;
顶点数据[4]=x;
顶点数据[5]=y;
//德鲁吉特劳高
顶点数据[6]=x;
顶点数据[7]=y;
顶点数据[8]=x+宽度;
顶点数据[9]=y;
顶点数据[10]=x+宽度;
顶点数据[11]=y+高度;
glBindBuffer(GL_数组_BUFFER,_vboID);
glBufferData(GL_数组_缓冲区、sizeof(VertexData)、VertexData、GL_静态_绘图);
glBindBuffer(GL_数组_BUFFER,0);
}
void Sprite::Render(){
glBindBuffer(GL_数组_BUFFER,_vboID);
GlenableVertexAttributeArray(0);
glvertexattributepointer(0,2,GL_FLOAT,GL_FALSE,0,0);
gldrawArray(GL_三角形,0,6);
glDisableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,0);
}
雪碧

#pragma once
#include <GL/glut.h>

class Sprite{
    public:
        Sprite(void);
        ~Sprite(void);
        void Init(float x, float y, float width, float height);
        void Render();
    private:
        float _x;
        float _y;
        float _width;
        float _height;
        GLuint _vboID; // Gluint na garantira da ce int biti 32 bita
};
#pragma一次
#包括
雪碧{
公众:
精灵(虚空);
~精灵(虚空);
void Init(浮动x、浮动y、浮动宽度、浮动高度);
void Render();
私人:
浮动x;
浮动;
浮动宽度;
浮动高度;
GLuint _vboID;//GLuint na garantra da ce int biti 32位
};

您没有初始化GLEW。如果不这样做,GLEW提供的所有入口点(这是OpenGL-1.1之外的所有东西)都将处于未初始化状态,调用它们会使程序崩溃


glutCreateWindow

之后,我对OpenGL不是非常熟悉,但是你传递了一个指向
VertexData
的指针,这让我非常紧张,一旦
Sprite::Init
完成,它就会超出范围。听起来像是一个
NULL
指针。你能不能使用调试器一步一步地确定导致错误的实际行?@CoryKramer:这里没有问题:glBufferData将生成传递给它的数据的完整副本。当一个缓冲区对象被绑定在OpenGL函数中,以…结尾的指针实际上期望一个字节偏移量,而不是数据参数的指针。是的:),我混合了glut和glew,我忘记了xD
if( GLEW_OK != glewInit() ) { return 1; }
while( GL_NO_ERROR != glGetError() ); /* glewInit may cause some OpenGL errors -- flush the error state */