Смешивание нескольких текстур для создания системы частиц

Вот в чем дело, я хочу сделать систему частиц на основе текстур и у меня есть текстура облака. Я сопоставляю текстуру с 10 разными полигонами, каждый из которых имеет одинаковый размер и текстуру. когда я смешиваю их друг с другом, возникает проблема, и пиксели, которые составляют, скажем, 5 полигонов, становятся слишком белыми! я не хочу этого. Я хочу что-то вроде эффекта буфера накопления. Я хочу получить такой эффект:

скажем, Rx,Bx,Gx будут цветом каждого пикселя, когда только 1 многоугольник находится на странице и пиксель находится внутри него. Теперь у нас есть n полигонов, каждый из которых имеет одинаковый размер и текстуру.

Rtotal = R1/n+R2/n+...+Rn/n, то же самое для Gtotal и Btotal

Что я могу сделать, чтобы получить такие результаты от альфа-смешивания.

Кстати, здесь инициализация.

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST) ;
glDepthFunc(GL_ALWAYS);

glEnable(GL_NORMALIZE);
glColor4f(.5,.5, .5,.2); 
glBlendFunc (GL_SRC_ALPHA, GL_DST_ALPHA);

person Amir Zadeh    schedule 02.01.2011    source источник
comment
Вы забыли указать свою целевую версию OpenGL.   -  person Kos    schedule 02.01.2011
comment
Вы можете сделать двухпроходное решение с шейдерами, где вы подсчитываете количество частиц в каждом фрагменте на первом проходе. Затем вы можете сделать деление так, как вы описали.   -  person Plow    schedule 02.01.2011
comment
Звучит как классный ответ: D, но для меня это сложно, потому что я новичок в шейдерах.   -  person Amir Zadeh    schedule 04.01.2011


Ответы (1)


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

Если вам достаточно, чтобы частицы выглядели нормально, то достаточно изменить режим наложения.

Они накапливаются до белого, потому что вы, вероятно, используете аддитивное альфа-смешивание:

result = source_color*source_alpha + destination_color

Или простое аддитивное смешивание:

result = source_color + destination_color

(где источник — это «цвет данного фрагмента», а пункт назначения — «то, что уже было в фреймбуфере в этом месте»).

Оба они распадаются до белого цвета с большим количеством «слоев». Но вы можете использовать «настоящее» альфа-смешивание:

result = source_color * source_alpha + destination_color * (1-source_alpha)

который не станет белым.

В OpenGL это соответствует:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Это не совсем то, что вам нужно, так как результат будет зависеть от порядка, но этого должно быть на 100% достаточно для системы частиц. Надеюсь, это поможет.

(Кроме того, не забудьте визуализировать сплошную геометрию перед частицами и отключить z-запись после этого.)

person Kos    schedule 02.01.2011
comment
Когда я делаю, как вы говорите, полигоны не смешиваются друг с другом! Может быть, я должен опубликовать код. Пожалуйста, скажите мне, если у вас есть время, чтобы просмотреть его. - person Amir Zadeh; 03.01.2011
comment
Также я не понял последние строки. Можете ли вы объяснить больше, пожалуйста - person Amir Zadeh; 03.01.2011
comment
Вы не забыли сделать glEnable(GL_BLEND)? Вы также можете опубликовать соответствующие части кода и, возможно, журнал кадров из GLintercept, если хотите. - person Kos; 03.01.2011