2010-07-17 2 views
2

Я использую OpenGL и рисую многоугольники в 2D-представлении. Как я мог размыть полигон, не используя glsl, и только такие вещи, как буфер трафарета и прочее. СпасибоРазмытие с OpenGL?

+0

Что относительно карты текстуры? Вы можете генерировать квадраты с соответствующим образом размытым взглядом (альфа уменьшается к краю или чем-то еще), а затем текстура отображает ваши полигоны, чтобы их края тоже шли. Это только размывается внутри. Однако истинное размывание будет выходить за пределы границы многоугольника. – cape1232

+0

Я, конечно, не специалист в OpenGL, но я бы не стал спорить, что самое простое решение исключает GLSL. – zneak

+0

OpenSceneGraph имеет атрибут [Fog] [http://www.openscenegraph.org/projects/osg/wiki/Support/Tutorials/StateSets], который можно включить в наборе состояний. OSG основана на OpenGL (правильно?), Поэтому должен быть способ дублирования эффекта. – cape1232

ответ

4

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

+0

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

+0

@Greg: Это, к сожалению, слишком верно! –

4

Есть два быстрых и грязных пути. GLSL или Cg - безусловно лучшее решение, особенно если вам нужно приличное размытие (гауссовское, box, motion и т. Д.). Однако вы можете:

  • Измените изображение с более низким разрешением, как правило, на текстуру, затем визуализируйте эту текстуру на экране при высоком разрешении. Это размывает изображение, но вам нужно использовать трилинейную или анистропическую фильтрацию, чтобы он выглядел хорошо. Обычно этого все равно не будет, но это поможет.
  • Измените изображение на текстуру, визуализируйте один раз на экран с полной непрозрачностью, затем включите смешение, поверните альфа и визуализируйте изображение влево немного, немного немного, немного вверх, немного вниз ... и т. д. Вам нужна малая непрозрачность для внутренних визуализаторов, но они будут эффективно размывать сцену. Вы также можете играть с режимами смешивания, может быть полезным SrcColor/InvSrcColor или DstColor/InvDstColor.

Есть несколько способов сделать это без шейдеров, но ни один из них не является оптимальным.

Смежные вопросы