Per Pixel Attenuation

Per Pixel Attenuation 1   Per Pixel Attenuation 2

Description:

This program displays a cube consisting simply of six quads. A light, using per-pixel attenuation, bounces inside the cube. The attenuation is calculated in four ways.

For the first three methods, the attenuation equation used is:

Attenuation=1-(d^2)/(r^2)

where:

d is the distance from the point to the light
r is the light's radius

The fourth method uses a Gaussian equation:

Attenuation=exp(-k*d^2)

Method 1

This is the method used by my "Per Pixel Lighting" project. It uses two textures storing the attenuation values, and computes 1-(Tex1+Tex2) in the register combiners.

Advantages: Relatively low hardware requirements
Disadvantages: 2 texture units used

Method 2

Using PASS_THROUGH_NV, part of NV_texture_shader, allows the texture coordinates passed to a texture unit to be interpolated, clamped to [0,1] and made available to the register combiners. The attenuation function is then calculated in the combiners.

Advantages: No textures used, Only 1 TMU used, Fastest method
Disadvantages: Nvidia specific

Method 3

This method is much like method 1, but uses a 3d texture instead of 2 textures. This saves a TMU.

Advantages: Only 1 TMU used
Disadvantages: Requires 3d texture support

Method 4

Gaussian attenuation is implemented similarly to method 1. It uses two textures to compute the attenuation, but using a simpler equation. The Gaussian function is separable by multiplication rather than by addition, so all that is needed to calculate it is a simple modulation of two textures. In this demo, this is done with register combiners for similarity to the other methods, but this can easily be calculated without.

Advantages: Low hardware requirements (only multitexture required)
Disadvantages: Uses 2 texture units

Requirements:

EXT_texture_edge_clamp
ARB_multitexture with at least 3 texture units
NV_vertex_program
NV_register_combiners

Recommended:

EXT_texture3D
NV_texture_shader

References:

Texture Compositing with Register Combiners, by John Spitzer. http://developer.nvidia.com

Real-Time Per-Pixel Point Lights and Spot Lights, by Ron Frazier. http://www.ronfrazier.net/apparition

Gaussian Attenuation, by Ignacio Castano. http://talika.eii.us.es/~titan/articles/

Download:

ppatten.zip (169 KB)