http://www.gamedev.net/reference/articles/...article2128.asp