Visual Studio 2008上的HelloWorld OpenGL程序中未处理的异常错误

时间:2013-10-29 22:17:07

标签: c++ opengl

下面是我的opengl代码,它可能没有做一些有意义的事情。我在代码中使用了freeglut库。以下是所有代码:

#include <glload/gll.h>
#include <glload/gl_3_0.h>
#include <GL/glut.h>
#include "glfw3.h"

void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h);
}

void RenderScene(void)
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glLoadIdentity();
    glLineWidth(1);
    glColor3f(1.0f, 0.0f, 0.0f);

    glBegin(GL_LINE);
    glVertex3f(0.0f, 0.0f, 0.5f);
    glVertex3f(0.0f, 1.0f, 0.5f);
    glVertex3f(1.0f, 1.0f, 0.5f);
    glEnd();

    glMatrixMode(GL_PROJECTION);
    glOrtho(-2.0,2.0,-2.0,2.0,-1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();



}

int main (int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
//  glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
//  glShadeModel(GL_SMOOTH);

    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    glutMainLoop();

    return 0;
}

以下是错误消息:

Unhandled exception at 0x00000000 in HelloGL5.exe: 0xC0000005: Access violation.

请注意,我注释掉了两行代码,我没有收到此错误。当我将两行中的一行添加到代码中时,为什么会出现此错误?

2 个答案:

答案 0 :(得分:2)

正如你在评论中所说的那样。

  

我的目标是OpenGL 4.4.0

您收到“访问冲突”错误的原因是因为您在OpenGL中使用了许多已弃用的功能。

以下函数是OpenGL 3.1版中不推荐使用的一些函数

  • glMatrixMode()
  • glLoadIdentity()
  • 在glBegin()
  • glEnd()
  • glVertex3 *()
  • glTexCoord *()
  • glNormal *()
  • glColor *()

这是一个关于“所有”OpenGL函数的优秀电子表格,以及它们是否已被弃用,删除,核心等等Click here to see it。我之所以说“全部”,是因为电子表格是由使用OpenGL而非 The Khronos Group 的人制作的。

现在你可能会问,如果不推荐使用 Matrix Stack 那么我们该怎么做呢,好吧......一切。现在你想要建立/计算和控制自己的 MatrixStack

以下是一些链接,您可以在其中阅读有关矩阵计算和矩阵变换的信息。

不推荐使用glBegin()glEnd()等原因的原因。是因为不推荐使用整个立即模式渲染。现在,您假设VAOsVBOs(和IBO)一起使用。

VAO

  

顶点数组对象(VAO)是一个OpenGL对象,它封装了指定顶点数据所需的所有状态(下面提到了一个小的例外)。它们定义顶点数据的格式以及顶点数组的源。请注意,VAO本身不包含数组;数组存储在Buffer Objects中(见下文)。 VAO只是引用已有的缓冲区对象。

来源:http://www.opengl.org/wiki/Vertex_Array_Objects#Vertex_Array_Object

VBO

  

顶点缓冲区对象(VBO)是一个缓冲区对象,用作顶点数组的数据源。它与任何其他缓冲区对象没有区别,用于转换反馈或异步像素传输的缓冲区对象可用作顶点数组的源值。

来源:http://www.opengl.org/wiki/Vertex_Specification#Vertex_Buffer_Object

答案 1 :(得分:1)

您使用NULL地址调用了函数。调试器会告诉你到底是哪一个。

在不知道你的库,上下文等的情况下,我的猜测是你的gl *函数在“glload / gll.h”或“glfw3.h”中都被声明为指针。删除这些包含内容并将其替换为#include <GL/gl.h>