Войти
ПрограммированиеФорумГрафика

Более реалистичный огонь с использованием частиц (4 стр)

Страницы: 1 2 3 4
#45
14:23, 3 июля 2009

Ну я сделал через VBO, но по-моему не особо быстрее стало. firedemo5.rar
Когда частиц мало и они большие - вроде ничего смотрится, но внизу огня траблы.
(на 5K частиц хорошо видны вихри потому что там размер уменьшился частицы но их еще не достаточно много чтобы все в желтый залилось).

вот так рисую:

  glBindBuffer(GL_ARRAY_BUFFER, m_vboId); 
  
  glEnableClientState(GL_VERTEX_ARRAY); 
  glEnableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  int sizeOfVertices = sizeof(float4)*m_vertexNum;
  int sizeOfColors = sizeof(float4)*m_vertexNum;
  int sizeOfTexCoords = sizeof(float2)*m_vertexNum;

  glBufferData(GL_ARRAY_BUFFER, sizeOfVertices+sizeOfColors+sizeOfTexCoords, 0, GL_DYNAMIC_DRAW);
  glBufferSubData(GL_ARRAY_BUFFER, 0, sizeOfVertices, (float*)m_vertexPosBuffer);                            
  glBufferSubData(GL_ARRAY_BUFFER, sizeOfVertices, sizeOfColors, (float*)m_vertexColorBuffer);              
  glBufferSubData(GL_ARRAY_BUFFER, sizeOfVertices+sizeOfColors, sizeOfTexCoords, (float*)m_vertexTexCoordBuffer);

  glVertexPointer(4,   GL_FLOAT, 0, 0);
  glColorPointer(4,    GL_FLOAT, 0, (void*)sizeOfVertices);
  glTexCoordPointer(2, GL_FLOAT, 0, (void*)(sizeOfVertices+sizeOfColors));

  glPushMatrix();
    glLoadIdentity();
    glDrawArrays(GL_QUADS, 0, m_vertexNum);
  glPopMatrix();

  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glDisableClientState(GL_VERTEX_ARRAY);

  glBindBuffer(GL_ARRAY_BUFFER, 0);      
Вообще я не очень понимаю, почему должно быть быстрее если я данные по шине все-равно гоняю.
По поводу оптимизации:

погонял в Vtune - CPU жрет физика с силовыми частицами.
Но если ее просто отключить, быстрее не станет. Вот если отключить силовые частицы, прозрачность и врубит Z-буффер - тогда работает в 3 раза быстрее.

Smouking
> ты нагружаешь пиксельный шейдер примерно так же как еслибы отрисовал 200 раз
> фулскрин
Видимо ты прав. Это означает что я ничего не могу сделать чтобы ускорить рендеринг?


#46
15:10, 3 июля 2009

Что-то не очень на огонь похоже. Особенно внизу.
Всю тему не читал (может уже предлагали), но может быть сделать постпроцессом? Записывать "толщину" огня (просто белые чатицы с аддитивным блендингом) в float-текстуру, а потом постпроцессом уже обрабатывать цвет. А то 10к частиц выдают унылое зрелище - посередине желтое пятно, по бокам красная обводка.

#47
15:24, 3 июля 2009

Хм, какая клевая идея! А я все думал, что бы мне такого замутить на шейдерах - отлично, я так и сделаю. Значит, будет какая-то функция, которая будет брать толщину и возвращать цвет - звучит не сложно.
Только сначала уберу глюк с полом и попробую все-же понять, можно ли что-то оптимизировать. Работает медленно на слабых машинах(

#48
17:37, 3 июля 2009

FROL
На неслабых тоже не очень быстро :)

#49
17:57, 3 июля 2009

FROL
> Наконец то я добрался до демки которую хотел давно написать. Сделал пока первую
> неоптимизированную реализацию. Вот она, простая демка огня
> Собственно прежде чем гнаться за скоростью, я хотел бы улучшить модель огня,
> сделать его более похожим на огонь.
> Я использовал следующую модель: ветер, гравитация и силовые частицы. Силовые
> частицы - это частицы к которым притягиваются другие частицы.
> И они также притягиваются друг к другу. За счет этого получаются вихри. Но
> чего-то все-таки не хватает.
> Хуже всего мой огонь по-моему выглядит на краях. На красный дым больше похоже.
> Вобщем, над чем я сам думал но еще не делал:
> 1) анимированные текстуры для частиц. Если есть у кого, скиньте плиз, я что-то
> не нашел подходящей последоваетльности.
> 2) вращающиеся в плоскости экрана частицы. не знаю, что это даст, тут вроде
> неплохо выглядит
> http://3drockstar.com/creating-realistic-fire-using-particles-in-3ds-max/
> Посоветуйте пожалуйста, как можно улучшить огонь на частицах, не усложняя его
> сильно.

не изобретайте велосипед

http://www.nvidia.com/object/demo_vulcan.html
http://http.developer.nvidia.com/GPUGems/gpugems_ch06.html

вы начали изначально двигаться с неправильного направления, сделав систему частиц пытаетесь из нее выжать хоть что либо реалистичное. для всех фотореалистичных эффектов необходимо двигаться со стороны качественных референсов, а не наоборот.

#50
18:30, 3 июля 2009

xDimka
> вы начали изначально двигаться с неправильного направления, сделав систему
> частиц пытаетесь из нее выжать хоть что либо реалистичное.
О нет, нет, я просто хотел написать систему частиц - простенькую систему частиц с простенькой физ-моделью и посмотреть что получится.
Спасибо, я знаю, что существует GPU Gems)

Sergio666
> На неслабых тоже не очень быстро :)
Ну да) пока что я догадался сжать текстуры (в смысле уменьшить размер), поставить GL_NEAREST. Но не сильно помогает. Есть идеи как можно это ускорить? И можно ли?
Ну снизить количество частиц - оно понятно конечно.

#51
16:27, 6 июля 2009

Вобщем, я наигрался с частицами. Выложил финальную версию + исходники если кому вдруг интересно станет (правда они сыроваты). particles demo + src
В итоге я убрал глюки, сделал зеленый файербол и дым.  Дым отстойный, но мне уже лень что-то делать) И оптимизировать я почти ничего не стал (кроме того что уже писал), раз в-основном все упирается в альфа-блендинг то не вижу смысла. Всем спасибо большое за помощь.

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика

Тема в архиве.