Brushwave is an image plugin for the 3D rendering and animation package Lightwave 3D. It allows to render all kinds of polygonal models in a painterly style.

I started the project as a proof of concept for a German media company. It is fully usable and stable, while some features are missing. Unfortunately, I have no time to continue development on this plugin, as I am busy with other projects, and I did not get a lot of feedback on the current version.

However, I would still be glad if someone could send me graphics that were rendered with the help of Brushwave!

Any feedback? ⇒ Visit the Discussion-Page!


You can download Brushwave from its project site on
The following files are available:

  • the binary
  • the source code
  • several basic sample brushes

Screenshots & Videos

Unfortunately, I haven't got very many images yet. I did work with several complex models and scenes during my tests, but it's not possible to publish those images due to copyright issues. If you have created any nice images or movies with the plugin, I would be pleased to publish them on this page!

For those images I have, just click on them to view the full resolution:

Moby Anime Eye


How does it work?

A few years ago, I created a realtime painterly renderer in OpenGL. It worked quite well, but the image quality was not overwhelming due to some of the compromises I had to take to allow real time rendering. This plugin is taking the reverse approach – I want to achieve the maximum image quality, while mainly ignoring performance issues.

The effect is achieved the following way:

  1. The painterly style is created by creating thousands of brush strokes.
  2. The strokes are plain rectangles, each placed on the surface of the rendered object .
  3. The color of the strokes is looked up in the ordinary Lightwave rendering of the scene.
  4. The style of the stroke (size, texture, etc.) depends on settings which can be defined through the user interface.

Here is a rough overview of the process:

The Brushwave rendering pipeline

Great care is taken to provide a maximum of frame to frame coherence:

  • The particles are placed on the polygons with an algorithm that assures that the positions will stay exactly the same every time the scene is rendered.
  • A stroke always has the same size on the output frame; it is independent from the distance of the camera to the object. Uniform brush density is achieved solely through smooth creation or destruction of additional brush strokes.

How do I use it?

Brushwave is used in Lightwave's Layout Mode. When you install the plugin (Utilities → Add Plugins), you will find that Brushwave consists of 2 plugins. One of them controls the settings of the rendering process, the other does the rendering.

To render an object with Brushwave, you have to take 2 steps:

1. Per-object settings

Select the object you want to edit, then open the properties dialog. In the “Geometry”-Tab, add the custom object “Brushwave Object”. Double-click it to manipulate its settings:

Per-object settings dialog

An overview of the meaning of the settings can be found here.

2. Global settings

If you rendered the scene now, nothing would happen. You first need to activate the Brushwave image filter. This can be done under “Windows → Image Processing → Add image filter”. Choose the filter “Brushwave”. The filter does not have many settings yet:

Global settings dialog

That's it!

If you render the scene now, the model will be rendered in a painterly style. If you save the scene, Lightwave will remember the settings for the next time.

Tips & Issues

When you render still images, everything should work fine out of the box – there is not much to take care of. When creating animations, however, there are some things you have to take into consideration. Most of them are a direct result of Brushwave's architecture.

Flickering at model and frame edges

The color of each brush stroke is taken from a reference picture (the image rendered in a conventional style by Lightwave). This is the only source where Brushwave can find the color of a brush stroke!

There are, however, situations when Brushwave knows that there should be a brush stroke, but is has no way of finding its color. In this case, the stroke cannot be rendered! In animations, this usually means: the area will flicker more or less heavily. The following situations can lead to this effect:

  1. The regions near the 4 edges of a frame. Imagine a stroke being just outside the picture: its center is outside the picture, but a part of it reaches into the picture. With no information about the color at the center of the particle, it cannot be drawn.
  2. Regions on models moving behind other models. If the center of the brush is hidden behind another model, its color cannot be looked up correctly.

Until I find a solution for these problems (read: get rid of the color lookup in the reference image), you can use the following workarounds:

  1. Render the animation in a resolution that's several pixels bigger than the real output, and crop it at the 4 sides.
  2. Render foreground and background separately and combine them later in post processing.

Flickering due to small polygons

Brushwave needs polygons that are big enough to produce at least 1-2 pixels in the output of the conventional rendering. When polygons get smaller than that, the surface will start to flicker. This means that you sometimes will have to reduce the complexity of your models if you want them to be rendered in a painterly style. Since any small details are lost anyway as soon as you draw the model with brushes, this should not be a problem in most cases.

projects/brushwave.txt · Last modified: 2010/02/08 06:00 (external edit) · [Old revisions]
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki