Я пытался использовать этот учебный http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
Я загружаю его в своей Visual Studio 2008, компилирую его, и это говорит недостающий файл: "GLES/glplatform.h", таким образом, я гуглю файл... затем, он жалуется недостающий файл: "KHR/khrplatform.h", таким образом, я гуглю это также... затем, это жалуется все возможное, "необъявленный идентификатор GLDouble" и т.д. и т.д., даже при том, что то учебное руководство имеет #include, который должен иметь их.
Я не знаю, где начать фиксировать это, мог кто-то просто дать мне код, как использовать VBO правильно (потяните куб и т.д.), каждый код я попробовал просто компиляция привычки или катастрофические отказы. я не могу найти ничего, что работает.
Хорошо, давайте начнем с того, что вам следует проверить. В вашем компиляторе найдите 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);