Как получить работу VBO

Я пытался использовать этот учебный http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45

Я загружаю его в своей Visual Studio 2008, компилирую его, и это говорит недостающий файл: "GLES/glplatform.h", таким образом, я гуглю файл... затем, он жалуется недостающий файл: "KHR/khrplatform.h", таким образом, я гуглю это также... затем, это жалуется все возможное, "необъявленный идентификатор GLDouble" и т.д. и т.д., даже при том, что то учебное руководство имеет #include, который должен иметь их.

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

7
задан Newbie 25 June 2010 в 21:09
поделиться

1 ответ

Хорошо, давайте начнем с того, что вам следует проверить. В вашем компиляторе найдите gl.h. Если вы не найдете его, скачайте Windows SDK . Если вы пользуетесь Visual Studio, то возьмите только файлы OpenGL. Я предлагаю вам полный SDK, потому что я еще не нашел gl.h по отдельности, вероятно, потому, что он есть у всех .. Что касается SDK, в Windows Server 2003 R2 Platform SDK эти файлы openGL наверняка есть, но вы должны сначала попробовать Windows 7 / Vista SDK.

Сейчас. Вы упомянули ГЛЕС. Я не знаю, как работают 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 () func:

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. При отображении вы очищаете окно для использования, выбираете цвет рисунка, и теперь привязка означает АКТИВИРОВАТЬ этот буферный объект. Вы можете иметь количество 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, уничтожьте ее чтобы предотвратить утечку памяти. Поскольку видеопамять не такая большая, это может быть серьезно. Вот как это сделать:

glDeleteBuffers(1, &ID);
13
ответ дан 6 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: