Я пытался реализовать 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
В вашем коде отсутствуют какие-либо проверки доступности требуемой версии OpenGL (или в случае, если вы использовали расширения, если они присутствуют). Вы всегда должны проверять, присутствует ли запрашиваемая функциональность.
Смотрите 2-й абзац http://glew.sourceforge.net/basic.html
Теперь объекты Vertex Buffer являются действительно широко распространенной функцией, и вряд ли они будут недоступны. Но авария указывает на то, что это самая проблема. Поэтому убедитесь, что вы правильно установили нужные драйверы.
Я работаю на рабочей станции с подключением к удаленному рабочему столу. Я только что попытался запустить код прямо на машине, и он работает. VBO не работает с RDC. Я чувствую себя действительно глупо. Огромное спасибо за помощь.
У меня была такая же проблема с использованием GL < 4.0. настройка glewExperimental = GL_TRUE;
как раз перед glewInit();
решил это.
В любом случае, проблема удаленного рабочего стола, код для проверки VBO с помощью GLEW заключается в следующем:
bool hasVBO = GLEW_ARB_vertex_buffer_object == TRUE;
bool hasVAO = GLEW_ARB_vertex_array_object == TRUE;
Для тех из вас, кто все еще испытывает трудности с этой проблемой, ваша программа потерпит крах, если вы позвоните glBindBuffer
из другого потока, который не является потоком рендеринга. По крайней мере, при работе с Allegro 5. Я исправил это, переместив мой код VBO в основной поток, и сбой прекратился.
Я получил удаленный рабочий стол для работы между двумя компьютерами 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. Чтобы проверить, запустите командное окно «запрос сеанса» и увидите строку, начинающуюся с «>».