2011-01-31 55 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)。