Как заставить работать VBO
Я пытался использовать этот учебник http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
Я загружаю его в моей Visual Studio 2008, скомпилирую, и он говорит отсутствующий файл: "GLES/glplatform.h", поэтому я гуглю файл... затем он скулит отсутствующий файл: "KHR/khrplatform.h", поэтому я Google это тоже... тогда это скулит все возможное, "необъявленный идентификатор GLDouble" и т. д. и т. д., даже если в этом уроке есть #include, которое должно иметь их.
Я не знаю, с чего начать это исправлять, может кто-нибудь просто дать мне код, как правильно использовать VBO (нарисовать куб и т. Д.), Каждый пробный код просто вылетает или не компилируется. Я не могу найти ничего, что работает.
1 ответ
Итак, давайте начнем с того, что вы должны проверить. В вашем компиляторе ищите gl.h. Если вы не найдете его, скачайте Windows SDK. Если вы используете Visual Studio хорошо для вас, если не брать только файлы OpenGL. Я предлагаю вам полный SDK, потому что я еще не нашел gl.h по отдельности, возможно потому, что он есть у всех.. Что касается SDK, в Windows Server 2003 R2 Platform SDK эти openGL-файлы наверняка есть, но вам следует сначала попробовать Windows 7 Vista SDK.
Сейчас. Вы упомянули GLES. Я не знаю, как работает GLES, потому что я использую GLEW. Во многих отношениях NeHe написал отличные учебники, но они устарели. Так что, если вы хотите продолжить со мной, используйте GLEW. Вы включите его на старте + вам нужно будет предоставить библиотеку. Как это
#include <GL/glew.h>
#pragma comment(lib,"glew32.lib")
Также вам нужно будет скопировать glew32.dll в папку, где находится ваш EXE.
Теперь вы должны быть настроены на создание VBO. Я предполагаю, что вы уже узнали, как создать пустое окно, если здесь нет ссылки. Вам придется скачать GLUT(или лучше freeglut), если вы этого еще не сделали, но он широко используется, и в любом случае он вам понадобится позже.
Мы сделаем некоторые дополнения в этом коде. В main func, вызовите init() под вызовом CreateWindow, как это
glutCreateWindow ("You’re first OpenGL Window");
init();
и сделать функцию init похожей на это:
void init(){
glewInit();
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glShadeModel(GL_FLAT);
glEnableClientState(GL_VERTEX_ARRAY);
}
также сделайте функцию reshape():
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);
}
и добавьте эту строку под glutDisplayFunc(display);
glutReshapeFunc(reshape);
Теперь мы готовы к VBO, на самом деле это было просто тривиальное создание окна, в котором мы можем видеть вывод, но, как вы сказали, у вас были некоторые проблемы, я лучше записал их, как и для других.
Итак, как использовать VBO, если вы хотите увидеть результат, вот код, я постараюсь рассказать вам об этом: сделать глобальную переменную
GLuint ID;
перед любой из функций
добавьте эту часть внизу функции init():
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);
и эта часть в функцию отображения, которая в данный момент пуста:
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_POLYGON,0,3);
glFlush();
Вы должны увидеть черный треугольник. Так к коду. Вы делаете какие-то данные. Затем вы генерируете новый VBO ID, который не используется (в нашем примере это будет 1 каждый раз:)). После этого с помощью вызова Bind вы фактически создаете этот VBO, а с помощью вызова BufferData вы назначаете свои данные этому VBO. На дисплее вы очищаете окно для использования, выбираете цвет рисунка и теперь Bind означает АКТИВИРОВАТЬ этот буферный объект. Вы можете иметь номер VBO в ARRAY_BUFFER, но только один может быть активным. VertexPointer используется для установки начала VBO и переходов между его элементами. Как вы можете видеть, мы использовали координаты X и Y в качестве элементов, поэтому шаг равен 2*sizeof(float). Это потому, что шаг в байтах. Finnaly DrawArrays - это вызов рендеринга, такой же, как вызовы glBegin() и glEnd(). Вы говорите, что рисовать, и в каком диапазоне. glFlush() просто используется для отображения отрендеренных вещей.
Если вы потерялись где-то в коде, то он находится в одном месте:
#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;
}
PS: я знаю, что это месячный вопрос, но я думаю, что на все вопросы нужно ответить, чтобы любой, кто ищет ту же проблему, не попал сюда и ничего не нашел;)
PSS: Если в этом примере запрашиваются DLL, они у вас есть в FreeGlut или GLEW bin-файлах;)
Edit1: я забыл об этом, поэтому не делайте ту же ошибку, после того, как вы закончите с VBO, уничтожьте его, чтобы предотвратить утечку памяти. Поскольку VRAM не такой большой, это может быть серьезно, вот как это сделать:
glDeleteBuffers(1, &ID);