Войти
OpenGL communityФорумВопросы по программированию

Создание прозрачного призрака-силуэта

#0
18:52, 11 дек. 2012

Всем доброго времени суток!
У меня есть довольно сложный объект, состоящий из N-го количества простых фигур. Есть задача - сделать полупрозрачный "призрак" этого объекта. Призрак должен быть однотонным, и в этом главная беда. Если просто сделать цвет фигур полупрозрачным, то в местах наложения друг на друга образуется дополнительное потемнение, коего и нужно избежать. Просчитывать порядок отрисовки не подходит по определенным причинам.
Пробовал также отрисовывать в объект непрозрачным цветом в дополнительном буфере цвета, но при отрисовке в основной буфер не могу задать прозрачность.
Может быть, кто-то уже сталкивался с этим?


#1
18:59, 11 дек. 2012

Попробовать отрисовать объект в текстуру с прозрачностью?

#2
19:03, 11 дек. 2012

  Может быть поможет стенсил-буфер.

#3
20:06, 11 дек. 2012

я бы попробовал
glBlendEquation(GL_MIN) или glBlendEquation(GL_MAX)
еще собственно glBlendFunc можно настроить или glBlendFuncSeparate


отрисовать в текстуру тож хороший способ. особенно если потом надо делать glow

#4
15:12, 12 дек. 2012

Увы, функции glBlendEquation, glBlendFuncSeparate вряд ли подойдут. Какой бы ни был принцип смешивания, сначала он смешает цвета фигуры и фона, а затем получившийся цвет смешает с цветом другой фигуры, т.е. конечный цвет будет отличаться в местах, где фигуры накладываются друг на друга.
С текстурами вариант поинтереснее. Как я понял, нужно создать текстуру с прозрачностью, отрисовать объект, вывести текстуру на экран. Есть ли способ просто добавить всю текстуру поверх буфера, или придется натягивать её на квадрат с вершинами (0, 0, width, height)?

#5
15:17, 12 дек. 2012

Inflight
> всю текстуру поверх буфера
Пиксельный шейдер не жалко?

Inflight
> Как я понял, нужно создать текстуру с прозрачностью, отрисовать объект, вывести
> текстуру на экран.
Все верно, так и надо делать.

#6
15:36, 12 дек. 2012

trex
> Пиксельный шейдер не жалко?
В смысле не жалко? А вообще хотелось бы обойтись без шейдеров.

#7
15:49, 12 дек. 2012

Inflight
> В смысле не жалко?
Будет обрабатывать кучу прозрачных точек.
Если не шейдер, то кусок конвеера, который заменяет пиксельный шейдер в GL1.0

#8
16:06, 12 дек. 2012

trex
> Будет обрабатывать кучу прозрачных точек.
> Если не шейдер, то кусок конвеера, который заменяет пиксельный шейдер в GL1.0
Жалко конечно. А есть способ лучше?

#9
16:10, 12 дек. 2012

Inflight
> А есть способ лучше?
Можно попробовать посчитать в какой прямоугольник поместится изображение и выводить только его.
Но если это считать сложно, тогда выводить всю текстуру, больше никак.

#10
18:44, 12 дек. 2012

trex
> Можно попробовать посчитать в какой прямоугольник поместится изображение и
> выводить только его.
> Но если это считать сложно, тогда выводить всю текстуру, больше никак.

Всем спасибо за участие, решение практически найдено :) Zefick был прав, в этом случае хорошо применять буфер трафарета. Вот цитата из "красной книги":
"Предположим, что у вас есть полупрозрачная поверхность, состоящая из нескольких,
слегка перекрывающихся полигонов. Если вы просто используете цветовое наложение,
части нижележащих объектов будут закрываться более чем одной прозрачной
поверхностью, что неправильно. Чтобы каждый фрагмент накрывался только одной
частью поверхности, используйте буфер трафарета. Установите буфер трафарета в
нули, рисуйте, только если плоскость трафарета имеет значение 0, и при рисовании
инкрементируйте значение в плоскости трафарета."
Единственная беда - это хорошо работает без ARB_Multisample, при включении оного что-то случается с буфером трафарета и эффект пропадает(
Ну ничего, с этим уж как-нибудь разберусь.

#11
19:33, 12 дек. 2012

трафарет надо курить, как написал Zefick
сори не заметил в последнем посте автора о нем )

OpenGL communityФорумВопросы по программированию

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