glBindBuffer崩溃 - 使用glew实现VBO

时间:2012-10-04 22:02:40

标签: c++ opengl vbo

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

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

错误出现在我glBindBuffer(GL_ARRAY_BUFFER, ID); void init()中的#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; } 。 我使用了以下问题的代码:How to get VBO working

{{1}}

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

6 个答案:

答案 0 :(得分:2)

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

请参阅http://glew.sourceforge.net/basic.html

的第2段

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我使用GL&lt; 4.0。在glewExperimental = GL_TRUE;解决之前设置glewInit();

答案 3 :(得分:0)

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

bool hasVBO = GLEW_ARB_vertex_buffer_object == TRUE;
bool hasVAO = GLEW_ARB_vertex_array_object == TRUE;

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

在批处理文件中,输入:

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.要检查,请运行命令窗口“查询会话”,并查看以“&gt;”开头的行。