Как заставить работать 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);
Другие вопросы по тегам