3 / 3 / 0
Регистрация: 27.09.2021
Сообщений: 77
1

Opengl Particles

19.02.2024, 15:06. Показов 281. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. У меня такой вопрос: хочу добавить к проекту систему частиц, но не до конца понимаю, как это сделать... В моем понимании самый лучший вариант будет использовать так называемый инстансинг. В частности, что я хочу сделать: создать VAO и прикрепить к нему 2 VBO: 1й будет содержать вершинные данные (условно, 2 float для позиции и 2 float для координат одной частицы), а 2й - это массив матриц моделей. Правильно ли я понимаю, что если я хочу сделать частицы подвижными, мне на каждой итерации нужно будет пересчитывать каждую матрицу модели (что, конечно же, очевидно) и нужно будет обновлять вот этот 2й VBO?
Это будет выглядеть примерно как-то так:

C++
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
    glGenVertexArrays(1, &_vao);
    glGenBuffers(1, &_vbo);
    glGenBuffers(1, &_ins_vbo);
 
    glBindBuffer(GL_ARRAY_BUFFER, _ins_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * amount, mModelArr, GL_STREAM_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
 
    glBindVertexArray(_vao);
 
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(0 * sizeof(float)));
    glEnableVertexAttribArray(0);
 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(2 * sizeof(float)));
    glEnableVertexAttribArray(1);
 
 
    glBindBuffer(GL_ARRAY_BUFFER, _ins_vbo);
 
    int vec4Size = sizeof(glm::vec4);
    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)(0 * vec4Size));
    glEnableVertexAttribArray(2);
    glVertexAttribDivisor(2, 1);
    
    glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)(1 * vec4Size));
    glEnableVertexAttribArray(3);
    glVertexAttribDivisor(3, 1);
    
    glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)(2 * vec4Size));
    glEnableVertexAttribArray(4);
    glVertexAttribDivisor(4, 1);
    
    glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 4 * vec4Size, (void*)(3 * vec4Size));
    glEnableVertexAttribArray(5);
    glVertexAttribDivisor(5, 1);
 
    glBindVertexArray(0);
Соответственно, это я буду делать на каждой итерации:

C++
1
2
3
4
5
6
    // update mModelArr
    glBindBuffer(GL_ARRAY_BUFFER, _ins_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * amount, mModelArr, GL_STREAM_DRAW);
    //
    //
    glDrawArraysInstanced(GL_LINE_LOOP, 0, 4, amount);
Вопрос в том, правильно ли я это понимаю? или есть более верный и быстрый способ обработки и отрисовки частиц
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2024, 15:06
Ответы с готовыми решениями:

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю...

Ошибки при подключение opengl, немного не связанные с opengl
#include <windows.h> #include "stdafx.h" #include <gl/gl.h> #include <gl/glu.h> #include...

OpenGL + GlTools по книге OpenGL Суперкнига
В главе 4 есть пример с отрисовкой 3хмерного вращающегося тора. Вот код: void RenderScene(void) {...

3
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,331
19.02.2024, 21:50 2
Цитата Сообщение от dnn_x1 Посмотреть сообщение
2 float для позиции и 2 float для координат одной частицы
А в чем отличия между позициями и координатами?
А что мешает двигать сами частицы без матриц и обновлять их положения в буфере? Можно все делать на видеокарте, если известен закон движения (без взаимодействия между частицами) в вычислительных шейдерах
0
3 / 3 / 0
Регистрация: 27.09.2021
Сообщений: 77
20.02.2024, 11:14  [ТС] 3
Цитата Сообщение от alecss131 Посмотреть сообщение
А в чем отличия между позициями и координатами?
Да, пардон, опечатался. Я хотел сказать 2 float для позиции и 2 float для Текстурных координат
Цитата Сообщение от alecss131 Посмотреть сообщение
А что мешает двигать сами частицы без матриц и обновлять их положения в буфере?
Я бы хотел иметь возможность обращаться к элементам матрицы моделей из приложения для взаимодействия с другими объектами и т.п.
0
1821 / 730 / 98
Регистрация: 01.10.2012
Сообщений: 3,735
20.02.2024, 11:15 4
Цитата Сообщение от dnn_x1 Посмотреть сообщение
Вопрос в том, правильно ли я это понимаю? или есть более верный и быстрый способ обработки и отрисовки частиц
Технически правильно. Но является ли этот способ лучшим - не уверен. Партиклы - учебный пример вычислительного шейдера, стоит глянуть туда.

И есть хороший тест - попробовать сделать дым или взрыв, тогда станет ясно чего стоит такая система партиклов
0
20.02.2024, 11:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2024, 11:15
Помогаю со студенческими работами здесь

OpenGL.Урок 1. простой OpenGL-проект
Не компилируется кодю #include <GL\glut.h> void DrawLine() { ...

Сильно отличаются OpenGL ES и OpenGL и как?
Сильно отличаются OpenGL ES и OpenGL и как?

OpenGL и OpenGL ES в чём разница функционала?
Здравствуйте! Чем отличается функционал OpenGL от OpenGL ES? Можно делать игры на pc используя...

OpenGL - VS2008 Инициализация OpenGL (Glut)
Правильно ли я написал код для выведения 3d изображения на экран? Вот пару недель наверно искал...

Не загружается текстура в OpenGL (OpenGL + Классы)
Здравствуйте! Пишу движок для игры. Первый прототип я сделал процедурно. Все работает как надо. ...

Перевод OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3, 8th Edition
Уважаемые форумчане! У вас есть возможность выразить свою активную позицию по вопросу о переводе...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru