-1

下面是我的 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.

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

4

2 回答 2

2

正如你在评论中所说。

我的目标是 OpenGL 4.4.0

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

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

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

这是一个关于“所有”OpenGL函数以及它们是否被弃用、删除、核心等的很棒的电子表格。点击这里查看。我之所以这样说“全部”,是因为电子表格是由使用 OpenGL 的人制作的,而不是由The Khronos Group制作的。

现在您可能会问,如果矩阵堆栈已被弃用,那么我们应该怎么做,嗯……一切。底线现在你假设构建/计算和控制你自己的MatrixStack

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

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

VAO

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

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

伊博

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

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

于 2013-11-02T20:15:05.693 回答
1

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

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

于 2013-10-30T06:08:10.040 回答