Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VBO и частицы 
:(
    Опции темы
kefir01
Дата 19.4.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Друзья, я новичок в OpenGL и VBO.
Успешно научился подгружать из 3ds файла модель и отрисовывать через VBO

Хотелось бы узнать как пользоваться VBO если речь идет о частицах (огонь/фонтан и т.п.)
Не могли бы вы дать небольшой пример с пояснениями smile или ссылкой на литературу, доступно объясняющую что да как

Заранее спасибо!

Добавлено через 2 минуты и 2 секунды
Скажем как в этом случае использовать VBO
http://www.naturewizard.com/tutorial08.html
PM MAIL   Вверх
kefir01
Дата 20.4.2011, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Ну же на 28 просмотров ни одного ответа?)))
Скажите ходь что нуб и покажите куда копать... Или просто никто не сталкивался с такой необходимостью?
PM MAIL   Вверх
Vetos
Дата 20.4.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



все точно также как и с моделей, только тебе придется обновлять VBO на каждый кадр.
Я так понял для огня и т.п. у тебя заведен массив? Теперь перед каждым кадром ты передаешь VBO измененный массив.
просто вместо обычного :
Код

glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(Vertex), &Vertices, GL_STATIC_DRAW);

ты делаешь
Код

glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(Vertex), &Vertices, GL_DYNAMIC_DRAW);

и делаешь это перед каждым кадром.
 GL_DYNAMIC_DRAW говорит OGL что данные будут постоянно изменятся, и он(OGL) размещает эти данные в оперативе, а не в памяти видеокарты как происходит с GL_STATIC_DRAW. Во всяком случае так написано в мануале.
VBO это просто способ передачи данных видеокарте, и то когда ты его будешь изменять значения не имеет


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
kefir01
Дата 20.4.2011, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Спасибо, дружище! Дай-ка я тебе плюсану) 

В общем-то я так и предполагал, но вводит в заблуждение одна вещь:
Код

- GL_STREAM_DRAW when vertices data could be updated between each rendering. 
- GL_DYNAMIC_DRAW when vertices data could be updated between each frames. 
- GL_STATIC_DRAW when vertices data are never or almost never updated


Так понимаю rendering - это событие отрисовки, происходящее при повороте/смене положения вида и т.п.
Тогда frame - произвольно выбранный отрезок времени - таймер там, функция отрисовки модели и все в таком роде?

И еще - кроме пользования возможностью такого общения с видеокартой есть ли реальный прирост производительности или для небольших задач это больше заморочка (дольше складывать буду нежели отрисовывать налету)?

У меня скорее фонтан из примера http://www.naturewizard.com/tutorial08.html, но в перспективе - да огонь... 
Кстати был бы рад ссылкам на примеры с огнем...
PM MAIL   Вверх
Rooctor
Дата 21.4.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Чтоб не гонять данные между процами заюзай вертексный шейдер.
PM MAIL   Вверх
kefir01
Дата 21.4.2011, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Rooctor, а можно ссылку на пример/документацию?

На самом задача небольшая. Один объект, фон, флаг и огонь - можно наверное и не заморачиваться, хотя полагаю подобные знания пригодятся.
PM MAIL   Вверх
Vetos
Дата 21.4.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Цитата(kefir01 @  21.4.2011,  15:30 Найти цитируемый пост)
Rooctor, а можно ссылку на пример/документацию?

Сам сейчас пишу прогу используя шейдера, использую версию OGL 3.2, а там без шейдеров и точку не нарисуешь.

Если тебе охота заморачиваться с изучением шейдеров(по себе скажу что трудно), то вот есть неплохой сайтик, где шаг за шагом показывается как шо делать, правда он на английском
LightHouse3D
Если сцена простенькая то и заморачиваться думаю не стоит, много времени потратишь на переделку своего проекта. По идее там уже есть готовый код по созданию и обработке шейдерной программы, просто главное понять сам процесс и работу шейдеров.


На счет фрэйма и рендеринга  ничего тебе не скажу, используй GL_DYNAMIC_DRAW smile .

Цитата(Rooctor @  21.4.2011,  14:32 Найти цитируемый пост)
Чтоб не гонять данные между процами заюзай вертексный шейдер.


Это дельный совет! Но если у тебя небольшой огонек, то прироста производительности ты не почувствуешь, но зато нет нужды держать массив с частицами в памяти и изменять их в каждом кадре, правильно запрограммировав шейдер ты получишь красивый результат.
Удачи!

Еще совет, используй glm, это математическая библиотека специально для OGL, все функции которые только могут пригодится, работа с матрицами, векторами, квантернионами ...

На всякий случай ссыла для скачивания, там еще есть полезные весчи smile (ссыла)
Если что не будет выходить пиши сюда чем смогу тем помогу.

Это сообщение отредактировал(а) Vetos - 21.4.2011, 17:26


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
kefir01
Дата 22.4.2011, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Спасибо!

Понял что сейчас не буду с шейдерами возиться - один огонек и так не перекроет прогу. Что на английском иногда даже лучше. Я вообще Qt использую - там тоже есть свои классы для создания шейдеров - надо еще туда сунуться будет.

Проблема еще в том, что приходится быстро и много всего одновременно учить. Постараюсь не донимать вопросами)
PM MAIL   Вверх
kefir01
Дата 23.4.2011, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



http://freespace.virgin.net/hugo.elias/models/m_main.htm

Немного огня, ветра, тряпок и всего прочего. Пользуйтесь!
PM MAIL   Вверх
kefir01
Дата 24.4.2011, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Продолжаем разговор...
http://forum.vingrad.ru/forum/topic-327864.html

Пытаюсь загрузить вершины и координаты в VBO...
Код

    lineNodes = width/2;
    totalNodes = pow(lineNodes, 2);
    float d = (float)1/lineNodes;

    QVector<QVector3D> vertices;
    QVector<QVector2D> textures;

    for(int x=0;x<lineNodes;x++)
    {
        for(int y=0;y<lineNodes;y++)
        {
            float tx1[2] = {x*d,-y*d};
            float tx2[2] = {(d + x*d),(-y*d)};
            float tx3[2] = {x*d,-(y*d + d)};
            float tx4[2] = {(d + x*d),-(y*d + d)};

            float pos1[3] = {pos.x()+(float)width*d*x, pos.y()-height*d*y, pos.z()};
            float pos2[3] = {(pos.x() + width*d*x + width*d), pos.y()-height*d*y, pos.z()};
            float pos3[3] = {pos.x()+width*d*x, (pos.y() - (height*d*y + height*d)), pos.z()};
            float pos4[3] = {(pos.x() + width*d*x + width*d), (pos.y() - (height*d*y + height*d)), pos.z()};

            vertices.append(QVector3D(pos1[0], pos1[1], pos1[2]));
            vertices.append(QVector3D(pos2[0], pos2[1], pos2[2]));
            vertices.append(QVector3D(pos3[0], pos3[1], pos3[2]));
            vertices.append(QVector3D(pos4[0], pos4[1], pos4[2]));


            textures.append(QVector2D(tx1[0], tx1[1]));
            textures.append(QVector2D(tx2[0], tx2[1]));
            textures.append(QVector2D(tx3[0], tx3[1]));
            textures.append(QVector2D(tx4[0], tx4[1]));

//рабочий код 
//            glTexCoord2fv(tx1);glVertex3fv(pos1);
//            glTexCoord2fv(tx2);glVertex3fv(pos2);
//            glTexCoord2fv(tx3);glVertex3fv(pos3);

//            glTexCoord2fv(tx3);glVertex3fv(pos3);
//            glTexCoord2fv(tx2);glVertex3fv(pos2);
//            glTexCoord2fv(tx4);glVertex3fv(pos4);
        }
    }

    glGenBuffersARB(1, &verticesVBO);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, verticesVBO);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(QVector3D)*totalNodes, (GLvoid*)vertices.constData(), GL_STATIC_DRAW_ARB);

    glGenBuffersARB(1, &texturesVBO);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, texturesVBO);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(QVector2D)*totalNodes, (GLvoid*)textures.constData(), GL_STATIC_DRAW_ARB);

    vertices.clear();
    textures.clear();


Отрисовка
Код

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, verticesVBO);
    glVertexPointer(3, GL_FLOAT, 0, NULL);

    glBindBufferARB(GL_ARRAY_BUFFER, texturesVBO);
    glTexCoordPointer(2, GL_FLOAT, 0, NULL);

    glDrawArrays(GL_TRIANGLES, 0, totalNodes);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);


Получаю следующее изображение...
Похоже неправильно выделяю память, но совершено не могу понять принцип... Еще есть ощущение, что в QVector неправильно добавляются значения. как-то все смещено...


Это сообщение отредактировал(а) kefir01 - 24.4.2011, 09:44

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  ______________2011_04_24___9.41.23.png 87,63 Kb
PM MAIL   Вверх
Vetos
Дата 26.4.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Не работал с Qt, но та епт, тыж в массив передаешь не два треугольника а четыре вершины, делай тогда glDrawArrays(GL_QUADS...

или на крайняк так, но тогда тебе придется пересчитать totalNodes
Код

TotalNodes=0;
//далее цыкл
{
            vertices.append(QVector3D(pos1[0], pos1[1], pos1[2]));
            vertices.append(QVector3D(pos2[0], pos2[1], pos2[2]));
            vertices.append(QVector3D(pos3[0], pos3[1], pos3[2]));
            vertices.append(QVector3D(pos3[0], pos3[1], pos3[2]));
            vertices.append(QVector3D(pos4[0], pos4[1], pos4[2]));
            vertices.append(QVector3D(pos1[0], pos1[1], pos1[2]));
 

            textures.append(QVector2D(tx1[0], tx1[1]));
            textures.append(QVector2D(tx2[0], tx2[1]));
            textures.append(QVector2D(tx3[0], tx3[1]));
            textures.append(QVector2D(tx3[0], tx3[1]));
            textures.append(QVector2D(tx4[0], tx4[1]));
            textures.append(QVector2D(tx1[0], tx1[1]));
TotalNodes+=6;
}



Это сообщение отредактировал(а) Vetos - 26.4.2011, 18:13


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Vetos
Дата 26.4.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



А вообще использовал бы ты для этого флага glDrawElements. Во первых ты бы сэкономил видеопамять, ведь передаешь одну и туже точку несколько раз, а это позиция и текстура, а в дальнейшем тебе понадобятся еще и нормали(если захочешь развивающийся флаг).
glDrawElements позволяет избежать дублирование вершин, помимо вершинных буферов, подключается еще индексный буфер(или просто передается в glDrawElements), в котором содержаться номера(индексы) вершин, ну вот простой пример

Код

vertexVBO = {{x,y,z},{x,y,z},{x,y,z},{x,y,z}}
textureVBO = {{x,y},{x,y},{x,y},{x,y}}
indexArray = {0,1,2,2,3,0}


vertex и texture содержат позицию и текст.коорд. четырех точек, а в indexArray находятся индексы вершин по которым уже строится два треугольника.

Думаю ты уже понял преимущество! Дерзай

Это сообщение отредактировал(а) Vetos - 26.4.2011, 18:35


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
kefir01
Дата 28.4.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Большое спасибо за совет. Да выглядит многообещающе. Я пока разбираюсь с огнем - флаг с ветром мне удались. Как разберусь - попробую сделать как предлагаешь.

Это сообщение отредактировал(а) kefir01 - 28.4.2011, 21:07
PM MAIL   Вверх
kefir01
Дата 30.4.2011, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Еще один вопрос - будут ли индексы последующих треугольников +4?
PM MAIL   Вверх
Vetos
Дата 1.5.2011, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 3
Всего: 4



Смотри рисунок, у тебя есть точки 0,1,2,3,4,5,6,7 - допустим это восемь точек, тогда индексы треугольников будут такими:
0,1,4  1,5,4   1,2,5   2,6,5   2,3,6    3,7,6.

Все зависит только от того как точки распологаются у тебя в массиве.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  attach.jpg 15,38 Kb


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1544 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.