хорошо, так что давайте начнем с того, что вы должны проверить.В вашем компиляторе ищите 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 () 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.На дисплее вы очищаете окно для использования, выбираете цвет рисунка и теперь 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;)*
Edit1: я забыл об этом, поэтому не делайте ту же ошибку, после того, как вы закончите с VBO, уничтожьте его, чтобы предотвратить утечку памяти.Поскольку VRAM не такой большой, это может быть серьезно, вот как это сделать:
glDeleteBuffers(1, &ID);