сбой glBindBuffer — реализация VBO с glew

Я пытался реализовать VBO на моем компьютере, и я столкнулся с ошибкой сегментации:

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

Ошибка на линии, где я звоню glBindBuffer(GL_ARRAY_BUFFER, ID); в void init(),
Я использовал код следующего вопроса: Как заставить работать VBO

#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

1

Решение

В вашем коде отсутствуют какие-либо проверки доступности требуемой версии OpenGL (или в случае, если вы использовали расширения, если они присутствуют). Вы всегда должны проверять, присутствует ли запрашиваемая функциональность.

Смотрите 2-й абзац http://glew.sourceforge.net/basic.html

Теперь объекты Vertex Buffer являются действительно широко распространенной функцией, и вряд ли они будут недоступны. Но авария указывает на то, что это самая проблема. Поэтому убедитесь, что вы правильно установили нужные драйверы.

2

Другие решения

Я работаю на рабочей станции с подключением к удаленному рабочему столу. Я только что попытался запустить код прямо на машине, и он работает. VBO не работает с RDC. Я чувствую себя действительно глупо. Огромное спасибо за помощь.

1

У меня была такая же проблема с использованием GL < 4.0. настройка glewExperimental = GL_TRUE; как раз перед glewInit(); решил это.

0

В любом случае, проблема удаленного рабочего стола, код для проверки VBO с помощью GLEW заключается в следующем:

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

Для тех из вас, кто все еще испытывает трудности с этой проблемой, ваша программа потерпит крах, если вы позвоните glBindBuffer из другого потока, который не является потоком рендеринга. По крайней мере, при работе с Allegro 5. Я исправил это, переместив мой код VBO в основной поток, и сбой прекратился.

0

Я получил удаленный рабочий стол для работы между двумя компьютерами Win7, работающими под управлением 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

Запустите его от имени администратора.
Он закроет сеанс, откроет консоль (ваш компьютер теперь вошел в систему, чтобы все могли подойти и использовать как вы), запустит программу и заблокирует экран.

Затем вы снова подключитесь с помощью удаленного рабочего стола; и ваша программа должна быть запущена с использованием графического аппаратного ускорения сервера.

Это предполагает, что ваш удаленный сеанс имеет идентификатор 1. Чтобы проверить, запустите командное окно «запрос сеанса» и увидите строку, начинающуюся с «>».

0
По вопросам рекламы [email protected]