next up previous contents
Next: 6.21.7 Example: Image Warping Up: 6.21 Procedural Texture Generation Previous: 6.21.5 Other Noise Functions

6.21.6 Turbulence

To create an illusion of turbulent flow, first-derivative discontinuities are introduced into the noise function by taking the absolute value of the function. Although OpenGL does not include an absolute value operator for framebuffer contents, the same effect can be achieved by the following:
1.
glAccumGL_LOAD,1.0(GL_LOAD,1.0);
2.
glAccumGL_ADD,-0.5(GL_ADD,-0.5);
3.
glAccumGL_MULT,2.0(GL_MULT,2.0);
4.
glAccumGL_RETURN,1.0(GL_RETURN,1.0);
5.
Save the image in the color buffer to a texture, main memory, or other color buffer.
6.
glAccumGL_RETURN,-1.0(GL_RETURN,-1.0);
7.
Draw the saved image from Step 5 using GL_ONE as both the source blend factor and the destination blend factor.
The calls with GL_ADD and GL_MULT map the values in the accumulation buffer from the range [0,1] to [-1,1]; this is needed because values retrieved from the color buffer into the accumulation buffer are positive. Since values from the accumulation buffer are clamped to [0,1] when returned, the first GL_RETURN clamps all negative values to 0 and returns the positive values intact. The second GL_RETURN clamps the positive values to 0, and negates and returns the negative values. The color buffer needs to be saved after the first GL_RETURN because the second GL_RETURN overwrites the color buffer; OpenGL does not define blending for accumulation buffer operations.
next up previous contents
Next: 6.21.7 Example: Image Warping Up: 6.21 Procedural Texture Generation Previous: 6.21.5 Other Noise Functions
David Blythe
1999-08-06