1

我一直在尝试在我的计算机上实现 VBO,但遇到了分段错误:

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

错误出现在我调用的glBindBuffer(GL_ARRAY_BUFFER, ID);void init()。我使用了以下问题的代码:How to get VBO working

#include <windows.h>
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>

#pragma comment(lib,"glew32.lib")

GLuint ID;

void init(){
    glewInit();
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glShadeModel(GL_FLAT);
    glEnableClientState(GL_VERTEX_ARRAY);
    float data[][2] = {{50,50},{100,50},{75,100}};
    glGenBuffers(1,&ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}

void reshape(int w, int h){
    glViewport(0,0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f,0.0f,0.0f);
    glBindBuffer(GL_ARRAY_BUFFER, ID);
    glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
    glDrawArrays(GL_TRIANGLES,0,3);
    glFlush();  
}

int main(int argc, char **argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(300,300);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

我的配置如下:Windows 7 / Geforce GTX 570 / glew 1.9.0

4

6 回答 6

2

您的代码缺少对所需 OpenGL 版本可用性的任何检查(或者在您使用扩展的情况下,如果存在扩展)。您必须始终检查请求的功能是否实际存在。

请参阅http://glew.sourceforge.net/basic.html的第 2 段

现在顶点缓冲区对象是一个非常普遍的功能,它们不太可能不可用。但是崩溃表明这就是问题所在。因此,请确保您正确安装了正确的驱动程序。

于 2012-10-04T22:14:02.983 回答
1

我正在使用远程桌面连接的工作站上工作。我刚刚尝试直接在机器上运行代码并且它可以工作。VBO 不适用于 RDC。我觉得自己真的很愚蠢。非常感谢你的帮助。

于 2012-10-04T22:35:21.457 回答
0

我在使用 GL < 4.0 时遇到了同样的问题。在解决它glewExperimental = GL_TRUE;之前设置。glewInit();

于 2012-10-05T10:33:29.910 回答
0

无论如何,除了远程桌面问题,使用 GLEW 检查 VBO 的代码是这样的:

bool hasVBO = GLEW_ARB_vertex_buffer_object == TRUE;
bool hasVAO = GLEW_ARB_vertex_array_object == TRUE;
于 2013-05-31T12:26:58.510 回答
0

对于那些仍然遇到这个问题的人,如果你glBindBuffer从另一个不是渲染线程的线程调用你的程序将会崩溃。无论如何,至少在使用 Allegro 5 时。我通过将我的 VBO 代码移动到主线程来解决这个问题,并且崩溃停止了。

于 2014-01-28T03:34:27.193 回答
0

我让远程桌面在两台运行 OpenGL 4.3 的 Win7 PC 之间工作:

在批处理文件中,输入:

tscon 1 /dest:console /PASSWORD:yourPassword
cd C:\your\Exe\Folder
start yourProgram.exe
C:\Windows\System32\rundll32.exe user32.dll,LockWorkStation

以管理员身份运行它。它将关闭会话,打开控制台(您的 PC 现在已登录,任何人都可以上前使用),启动程序并锁定屏幕。

然后您将使用远程桌面重新连接;并且您的程序应该正在运行,使用服务器的图形硬件加速。

这假设您的远程会话是 ID 1。要检查,运行命令窗口“查询会话”,并查看以“>”开头的行。

于 2015-09-28T22:49:37.523 回答