【问题标题】:Opengl program sample crashOpengl 程序示例崩溃
【发布时间】:2011-07-08 07:00:55
【问题描述】:

我编译了以下代码:

// 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;
    }

但是当我尝试执行它时程序崩溃了,然后调试器给了我以下错误:

Excepción no controlada en 0x00000000 en Triangle.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000000.

【问题讨论】:

  • 错误的翻译对你很好
  • 访问冲突发生在哪一行?
  • 取消引用空指针...
  • 调试器将有助于识别空指针被取消引用的实际行。很难猜出这里出了什么问题,表面上看起来还不错。坦率地说,由于调试器将在 2 秒内指向有问题的行,而挖掘代码需要几个小时,所以没有理由不使用调试器。
  • @Armen 访问违规,很容易弄清楚

标签: c++ opengl


【解决方案1】:

要使用glCreateShader(GL_VERTEX_SHADER),您必须运行 OpenGL 2.0 或更高版本。一种判断方法是检查GLEW_VERSION_2_0 的值(在调用glewInit() 之后)。如果该值为 true,则支持 OpenGL 2.0。否则,您可能需要更新显卡驱动程序或使用更新的显卡。

【讨论】:

    【解决方案2】:

    这样做的唯一方法:

    hVertexShader = glCreateShader(GL_VERTEX_SHADER)
    

    如果glCreateShader 为NULL,可以得到一个NULL 指针异常(你确定它是这一行而不是它之前的那一行吗?)。 GLTools 是 OpenGL Superbible 第 5 卷发行版的一部分;它不是一个“标准”的 OpenGL 工具,所以我不能多说。

    但您似乎正在初始化 GLEW。而且由于您不直接包含 GLEW 标头,我只能猜测 GLTools 正在为您包含它。所以 GLEW 的初始化应该会传递给 GLTools。

    检查“glCreateShader”的值。按照 GLEW 对该函数的#define 一直到 GLEW 定义的实际变量,然后检查该变量的值。如果它是NULL,那么你就有问题了。也许 GLEW 的初始化失败了。

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2011-03-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多