C++ glBindBuffer崩溃-带glew的VBO实现

C++ glBindBuffer崩溃-带glew的VBO实现,c++,opengl,vbo,C++,Opengl,Vbo,我一直试图在我的计算机上实现VBO,但遇到了一个分段错误: Unhandled exception at 0x00000000 in attocube.exe: 0xC0000005: Access violation 错误出现在我调用glBindBuffer(GL\u ARRAY\u BUFFER,ID)的那一行在void init()中。 我使用了以下问题的代码: #包括 #包括 #包括 #包括 #pragma注释(lib,“glew32.lib”) 颖片ID; void init(){

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

Unhandled exception at 0x00000000 in attocube.exe: 0xC0000005: Access violation
错误出现在我调用
glBindBuffer(GL\u ARRAY\u BUFFER,ID)的那一行
void init()
中。 我使用了以下问题的代码:

#包括
#包括
#包括
#包括
#pragma注释(lib,“glew32.lib”)
颖片ID;
void init(){
glewInit();
glClearColor(1.0f、1.0f、1.0f、0.0f);
glShadeModel(GLU平面);
glEnableClientState(GL_顶点_数组);
浮点数据[][2]={{50,50},{100,50},{75100};
glGenBuffers(1,&ID);
glBindBuffer(GL_数组_BUFFER,ID);
glBufferData(GLU数组缓冲区、大小(数据)、数据、GLU静态图);
}
空洞重塑(整数w,整数h){
gl(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0f,(GLdouble)w,0.0f,(GLdouble)h);
}
无效显示(){
glClear(GLU颜色缓冲位);
GL3F(0.0f,0.0f,0.0f);
glBindBuffer(GL_数组_BUFFER,ID);
glvertexointer(2,GL_FLOAT,2*sizeof(FLOAT),0);
GLDRAW阵列(GLU三角形,0,3);
glFlush();
}
int main(int argc,字符**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500500);
位置(300300);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMainLoop();
返回0;
}
我的配置如下:
Windows 7/Geforce GTX 570/glew 1.9.0

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

见本报告第2段


现在顶点缓冲区对象是一个非常广泛的特性,它们不太可能不可用。但这次事故表明这正是问题所在。因此,请确保正确安装了正确的驱动程序。

我正在使用远程桌面连接的工作站上工作。我刚刚试着直接在机器上运行代码,它可以工作。VBO不能与RDC一起工作。我觉得自己很愚蠢。非常感谢您的帮助。

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

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

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

对于仍有此问题的用户,如果从非渲染线程的另一个线程调用
glBindBuffer
,程序将崩溃。至少在使用Allegro 5时是这样。我通过将VBO代码移动到主线程来修复此问题,崩溃停止。

我让远程桌面在两台运行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
以管理员身份运行它。 它将关闭会话,打开控制台(您的电脑现在已登录,任何人都可以像您一样走过来使用),启动程序,并锁定屏幕

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


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

他在GeForce 570上;你找不到足够老的驱动程序来支持这样的硬件,而这些硬件不支持比GL 1.5更好的驱动程序。您可能找不到不支持GL 4.0的驱动程序。@Nicolas:对。但是:驱动程序安装是否正确?Windows7本身只在Direct3D层上提供了可怜的OpenGL-1.4,而Direct3D层不支持VBOs!(如您所知,VBO是在GL 1.5中引入的)。所以解决方案是去英伟达网站,下载全功能的驱动程序,安装它,而不是微软的版本。我已经更新了我的图形卡的驱动程序。你的
glewInit()
调用成功了吗?我已经把这个
GLenum err=glewInit();如果(GLEW_OK!=err){/*问题:glewInit失败,说明严重错误。*/fprintf(stderr,“错误:%s\n”,glewGetErrorString(err));}
没有错误消息。请在GLEW初始化
fprintf(stderr,“glBindBuffer的地址:%p\n”,glBindBuffer)之后添加以下内容:并告诉我们输出。另外一个好的诊断可能是
glGetString(GL_渲染器)的内容嗯,这并不奇怪:RDC在GPU上不做图形。因此,这意味着Windows7的低功能回退OpenGL实现,它只支持OpenGL-1.4。你对此无能为力。如果您的程序检测到正在RDC环境中运行,您可以访问Mesa的软件渲染器opengl32.dll,但性能会很差。我不认为我会开始使用RDC。我将为标准用户开发我的程序。谢谢你的帮助。
tscon 1 /dest:console /PASSWORD:yourPassword
cd C:\your\Exe\Folder
start yourProgram.exe
C:\Windows\System32\rundll32.exe user32.dll,LockWorkStation