27 / 29 / 2
Регистрация: 04.08.2015
Сообщений: 620
1

О буфер-объекте, glGenBuffers()

23.11.2015, 16:57. Показов 3697. Ответов 43
Метки нет (Все метки)

Здравстуйте, в книге по OpenGL о функции glGenBuffers() сказано что:

Функция
C++
1
void glGenBuffers(GLsizei n, GLuint *buffers);
возвращает n - не используемое в настоящее время имя для буфер-объекта в массив буферов - buffers.

По край не мере я так перевел.
Мне понятно что buffers хранит массив имен буферов, но я не могу понять что из себя представляет эта n?

Может мне кто нибудь растолковать подробнее об n?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2015, 16:57
Ответы с готовыми решениями:

Exception в glGenBuffers
#include <GL/glew.h> #include <GL/glut.h> #include <stdio.h> #include "math_3d.h" GLuint...

В какой библиотеке функция glGenbuffers?
Сказано, что надо использовать функцию glGenbuffers, которой у меня нет. Не можете ли подсказать,...

Prototype Объект в объекте в объекте
Всем здравствуйте! Хотел бы у спросить как оптимально организовать с объектом вида var...

Записать символ в буфер клавиатуры, проверить буфер на наличие в нём символов, и вывести данный символ
Доброго дня всем. Прошу помочь немного с несложной задачей, на использование прерывания INT 16h....

43
2526 / 1333 / 222
Регистрация: 26.02.2009
Сообщений: 6,178
Записей в блоге: 5
23.11.2015, 19:21 2
Лучший ответ Сообщение было отмечено koker007 как решение

Решение

Цитата Сообщение от koker007 Посмотреть сообщение
Может мне кто нибудь растолковать подробнее об n?
n - кол-во буферов которые могут тебе потребоваться. Лучше брать с запасом, так как вызов этой ф-ии не очень быстрый. Мне даже манагер пришлось написать, что бы пореже эту ф-ию дёргать.
Например:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var bufIDs:TArray<GLuint>;
 
SetLength( bufIDs, 1000 ); // выделяю место под ID сразу для 1000 буферов
glGenBuffers( Length(bufIDs), Pointer(bufIDs) ); // получаю от GL сразу все(1000) уникальных ID
 
// в процессе работы использую как мне захочется
// если закончились ID то опять повторяю выделение ещё для 1000 ID
// со стороны это выглядит так:
    CBO := Manager.Buffers.Get( Manager.Buffers.Unique );
    CBO.Bind;
    CBO.SetData<integer>( FColors );
 
//И только по завершении удаляю все сразу внутри менеджера
glDeleteBuffers( Length(bufIDs), Pointer(bufIDs) );
До этого было так что только в нужный момент я генерил ID буфера.
Delphi
1
glGenBuffers( 1, @Buffer );
Очень удобно для маленьких примеров. Но как только разом нужно было загрузить тысячи объектов приложение зависало неприлично долго. И как выяснилось основная задержка была именно там.
1
27 / 29 / 2
Регистрация: 04.08.2015
Сообщений: 620
23.11.2015, 21:36  [ТС] 3
То есть когда заходим в цикл рисования картинки нужно чтобы при рисовании объектов, буфер-объекты уже были сгенерированы и при перерисовке картинки данные в буфер-объекте просто сменялись.

Правильно понял?
0
2526 / 1333 / 222
Регистрация: 26.02.2009
Сообщений: 6,178
Записей в блоге: 5
24.11.2015, 12:22 4
Цитата Сообщение от koker007 Посмотреть сообщение
То есть когда заходим в цикл рисования картинки нужно чтобы при рисовании объектов, буфер-объекты уже были сгенерированы
Да. Генерить их каждый кадр - лишняя работа.
Цитата Сообщение от koker007 Посмотреть сообщение
при перерисовке картинки данные в буфер-объекте просто сменялись.
Вот это не понял.
0
27 / 29 / 2
Регистрация: 04.08.2015
Сообщений: 620
24.11.2015, 13:58  [ТС] 5
при перерисовке картинки данные в буфер-объекте просто сменялись.
Вот это не понял.
Спрашиваю, нужно ли другой функции как glBufferData(), которая принимает значения для буфер-объекта, иметь место каждый раз в цикле рисования изображения, или же ее нужно где то в другом месте вставлять? чтобы была анимация.

Во всяком случае спасибо на первый вопрос ответ уже получил)
0
2526 / 1333 / 222
Регистрация: 26.02.2009
Сообщений: 6,178
Записей в блоге: 5
24.11.2015, 14:11 6
koker007, в отрисовке не должно быть ничего лишнего кроме отрисовки. Все загрузки/выгрузки, генерации/удаления должны быть вне цикла отрисовки. Иначе цикл отрисовки должен называться как-то по другому и по сути уже не является только циклом отрисовки, что скажется на скорости. Если у вас анимация - подготовьте заранее все её кадры, а в самой отрисоке в зависимоти от номера кадра подставляете те или иные уже загруженные ID.
1
27 / 27 / 3
Регистрация: 03.04.2015
Сообщений: 105
24.11.2015, 20:24 7
Цитата Сообщение от snake32 Посмотреть сообщение
а в самой отрисоке в зависимоти от номера кадра подставляете те или иные уже загруженные ID.
И как тут интерполировать анимацию?
0
2526 / 1333 / 222
Регистрация: 26.02.2009
Сообщений: 6,178
Записей в блоге: 5
24.11.2015, 21:21 8
dvnisawesome, о какой анимации идет речь?
0
27 / 27 / 3
Регистрация: 03.04.2015
Сообщений: 105
24.11.2015, 22:33 9
Скелетная, частицы с коллизией, как вариант.
0
369 / 168 / 44
Регистрация: 11.07.2013
Сообщений: 884
09.03.2017, 16:53 10
Прчему-то у меня при вызове glGenBuffers( 1, @Buffer ); выдаёт ошибку "Проект project1 вызвал класс исключения External: SIGSEGV". Такое впечатление, что в OpenGL32.dll вообще такой процедуры нет. Как можно это исправить?
0
4535 / 2411 / 413
Регистрация: 05.10.2013
Сообщений: 6,614
Записей в блоге: 177
09.03.2017, 19:41 11
Цитата Сообщение от shyub Посмотреть сообщение
"Проект project1 вызвал класс исключения External: SIGSEGV"
Скорее всего, вы не выделили место для Buffer.

Добавлено через 1 минуту
Нагуглил несколько сетуаций, когда появится ошибка SIGSEGV

C
1
2
3
char *c = NULL;
...
*c; // dereferencing a NULL pointer
C
1
2
3
char *c = "Hello";
...
c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory
C
1
2
3
4
5
char *c = new char[10];
...
delete [] c;
...
c[2] = 'z'; // accessing freed memory
1
481 / 219 / 38
Регистрация: 24.01.2013
Сообщений: 665
09.03.2017, 19:44 12
shyub, https://wiki.delphigl.com/inde... nGL.pas/en
или самому получать адрес функции из драйвера видеокарты через wglGetProcAddress().
1
369 / 168 / 44
Регистрация: 11.07.2013
Сообщений: 884
10.03.2017, 07:26 13
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Скорее всего, вы не выделили место для Buffer.
Нет, не выделили. Инициализацию делаю по статье http://vbomesh.blogspot.com/20... pengl.html вот так (использую Лазарус и компонент TOpenGLControl):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var
  Form1: TForm1;
  VertexBuffer: Array of TVertex3f;
  ColorBuffer: Array of TColor3f;
  vId: GLuint;
  cId: GLuint;
............................
............................
procedure VBOInit;
var
  Count:integer;
begin
  Count:=high(VertexBuffer)+1;
  glGenBuffers( 1, @vId );  // Здесь возникает ошибка.
  glBindBuffer(GL_ARRAY_BUFFER, vId );
  glBufferData(GL_ARRAY_BUFFER, sizeof(GLFLoat)*3*Count, @VertexBuffer[0],
  GL_STATIC_DRAW); // Передача массива вершин в ОЗУ видеокарты.
  glBindBuffer(GL_ARRAY_BUFFER,0);
  glGenBuffers( 1, @cId );
  glBindBuffer(GL_ARRAY_BUFFER, cId );
  glBufferData(GL_ARRAY_BUFFER, sizeof(GLUByte)*3*Count, @ColorBuffer[0],
  GL_STATIC_DRAW); // Передача массива цветов в ОЗУ видеокарты.
  glBindBuffer(GL_ARRAY_BUFFER,0);
end;
procedure InitMas;
begin
  Setlength(VertexBuffer,6);
  Setlength(ColorBuffer,6); 
   VertexBuffer[0].X:=-1; VertexBuffer[0].Y:=1; VertexBuffer[0].Z:=0;
   VertexBuffer[1].X:=-1; VertexBuffer[1].Y:=-1;VertexBuffer[1].Z:=0;
   VertexBuffer[2].X:= 1; VertexBuffer[2].Y:=1; VertexBuffer[2].Z:=0;
   ColorBuffer[0].R:=1; ColorBuffer[0].G:=0; ColorBuffer[0].B:=0;
   ColorBuffer[1].R:=0; ColorBuffer[1].G:=1; ColorBuffer[1].B:=0;
   ColorBuffer[2].R:=0; ColorBuffer[2].G:=0; ColorBuffer[2].B:=1;
   VertexBuffer[3].X:= 1; VertexBuffer[3].Y:=1; VertexBuffer[3].Z:=0;
   VertexBuffer[4].X:=-1; VertexBuffer[4].Y:=-1;VertexBuffer[4].Z:=0;
   VertexBuffer[5].X:= 1; VertexBuffer[5].Y:=-1;VertexBuffer[5].Z:=0;
   ColorBuffer[3].R:=0; ColorBuffer[3].G:=0; ColorBuffer[3].B:=1;
   ColorBuffer[4].R:=0; ColorBuffer[4].G:=1; ColorBuffer[4].B:=1;
   ColorBuffer[5].R:=1; ColorBuffer[5].G:=1; ColorBuffer[5].B:=0;
 
   VBOInit; // Инициализация VBO-буффера в видеопамяти.
end;
Процедуру InitMas вызываю в TForm1.FormCreate.
0
2526 / 1333 / 222
Регистрация: 26.02.2009
Сообщений: 6,178
Записей в блоге: 5
10.03.2017, 10:46 14
shyub, в момент вызова InitMas проверьте:
1) Инициализирован ли контекст и активен ли он?
2) Загружен ли Адрес ф-ии glGenBuffers?
1
369 / 168 / 44
Регистрация: 11.07.2013
Сообщений: 884
10.03.2017, 13:45 15
Спасибо за помощь, заработало. В самом начале VBOInit добавил проверку версии S:=glGetString(GL_VERSION); и на основании версии запускаю соответствующую процедуру Load_GL_VERSION_x_x();, где версия OpenGL должна быть не ниже 2.0 и не выше установленной на компьютере.
И второе. Запускаю с задержкой после открытия формы.
0
4535 / 2411 / 413
Регистрация: 05.10.2013
Сообщений: 6,614
Записей в блоге: 177
11.03.2017, 09:11 16
Цитата Сообщение от shyub Посмотреть сообщение
добавил проверку версии S:=glGetString(GL_VERSION); и на основании версии запускаю соответствующую процедуру Load_GL_VERSION_x_x();
Выведите текст версии на экран. Соберите exe и прикрепите в архиве к сообщению. Я попробую у себя на ноуте. Дело в том, что на ноуте две видеокарты: дискретная и интегрированная. Система Optimus запускает exe с интегрированной. Есть способы как из программы сообщить, что нужно запускать с дискретной. Я знаю такой способ если использовать OpenGL на фреймворке .NET. из Visual Studio.
0
369 / 168 / 44
Регистрация: 11.07.2013
Сообщений: 884
12.03.2017, 11:03 17
Посмотрите OpenGLBuffeVBO.rar
1
4535 / 2411 / 413
Регистрация: 05.10.2013
Сообщений: 6,614
Записей в блоге: 177
12.03.2017, 11:14 18
Да, у вас всё нормально, запускается с дискретной картой:
Миниатюры
О буфер-объекте, glGenBuffers()  
1
369 / 168 / 44
Регистрация: 11.07.2013
Сообщений: 884
12.03.2017, 11:50 19
Что запускается с карты - хорошо, но не нравится, что на 4-х ядерном компе загружает одно ядро на 50%, а второе на 75%. Одну проблему решить удалось, появилась вторая.

Добавлено через 28 минут
Вообще, может так и должно быть при использовании OpenGL?
0
4535 / 2411 / 413
Регистрация: 05.10.2013
Сообщений: 6,614
Записей в блоге: 177
12.03.2017, 16:51 20
Я сделал точно такую же программу с VBO на C# и WPF. Посмотрите сколько она у вас тратит. И запускается ли вообще.
Миниатюры
О буфер-объекте, glGenBuffers()  
Вложения
Тип файла: rar OpenGLBufferVBO.rar (577.5 Кб, 8 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2017, 16:51

Объект в объекте
Начал изучать по книге Thinking_in_Java, там есть фраза: Ваш объект может содержать другие...

Мусор в объекте
Во время вызовы init появляется огромная куча мусора вместо даных. Отладчик мне, честно говоря, не...

Остановка на объекте
У меня такая проблема : У меня есть две картинки мне надо что бы когда первая картинка (анимацией )...

Поиск в объекте
Подскажите, как лучше осуществить поиск в объекте? Поле выбирается в html через select, получается...

Объект в объекте
Есть законченный модуль TMy_Class_1 _Unit, в котором реализован объект. Отдельно работая все...

Thread в объекте
Добрый вечер, вопрос следующий: Создать класс, реализующий функционал создания/остановки нити...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.