2011-01-31 111 views
2

那么,我搜索了一下,唯一的建议,我看到人们真正给的是一种模棱两可的,略有过时的驱动程序可能(我的是最新的Geforce G210m移动驱动程序)。无论如何,我只是学习OpenGL并学习了一些XNA,我觉得这将是一个很好的平衡,但我可以在开始时没有这样的挫折。OpenGL superbible访问冲突

无论如何,我只是直接从Triangle.cpp使用源代码。我得到:

OOGL.exe中0x00000000未处理的异常:0xC0000005:访问冲突。

紧接着调用triangleBatch.Begin()。

任何人都可以直接告诉我什么是和如何缓解呢?

这里是源:

// Triangle.cpp 
// Our first OpenGL program that will just draw a triangle on the screen. 

#include <GLTools.h>   // OpenGL toolkit 
#include <GLShaderManager.h> // Shader Manager Class 

#ifdef __APPLE__ 
#include <glut/glut.h>   // OS X version of GLUT 
#else 
#define FREEGLUT_STATIC 
#include <GL/glut.h>   // Windows FreeGlut equivalent 
#endif 

GLBatch triangleBatch; 
GLShaderManager shaderManager; 

/////////////////////////////////////////////////////////////////////////////// 
// Window has changed size, or has just been created. In either case, we need 
// to use the window dimensions to set the viewport and the projection matrix. 
void ChangeSize(int w, int h) 
    { 
    glViewport(0, 0, w, h); 
    } 


/////////////////////////////////////////////////////////////////////////////// 
// This function does any needed initialization on the rendering context. 
// This is the first opportunity to do any OpenGL related tasks. 
void SetupRC() 
    { 
    // Blue background 
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 

    shaderManager.InitializeStockShaders(); 

    // Load up a triangle 
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 
          0.5f, 0.0f, 0.0f, 
          0.0f, 0.5f, 0.0f }; 

    triangleBatch.Begin(GL_TRIANGLES, 3); 
    triangleBatch.CopyVertexData3f(vVerts); 
    triangleBatch.End(); 
    } 



/////////////////////////////////////////////////////////////////////////////// 
// Called to draw scene 
void RenderScene(void) 
    { 
    // Clear the window with current clearing color 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f }; 
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed); 
    triangleBatch.Draw(); 

    // Perform the buffer swap to display back buffer 
    glutSwapBuffers(); 
    } 


/////////////////////////////////////////////////////////////////////////////// 
// Main entry point for GLUT based programs 
int main(int argc, char* argv[]) 
    { 
    gltSetWorkingDirectory(argv[0]); 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow("Triangle"); 
    glutReshapeFunc(ChangeSize); 
    glutDisplayFunc(RenderScene); 

    GLenum err = glewInit(); 
    if (GLEW_OK != err) { 
     fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err)); 
     return 1; 
     } 

    SetupRC(); 

    glutMainLoop(); 
    return 0; 
    } 
+2

检查您的GPU是否支持{{{GLBatch}}}使用的OpenGL扩展。 – tibur 2011-01-31 14:20:36

回答

0

通过查看GLBatch的代码,看错误,它几乎可以肯定,无论是GL_ARB_vertex_array_object或GL_ARB_vertex_buffer_object扩展缺少您的计算机上。代码没有检查,所以这就是它的原因。

溶剂?如果GLBatch.cpp中glGenVertexArrays()被调用的行失败,只需在文件开始处定义#define OPENGL_ES,它将禁用顶点数组对象,并且一切都会正常(这是一个新的扩展,它可能不是由你的GPU支持)。如果它在glGenBuffers()失败,那么可能没有代码补救措施。您需要确保您拥有最新的图形卡驱动程序,并且支持GL_ARB_vertex_buffer_object扩展(您可以使用OpenGL Extension Viewer)。