Generating correct reflections with a local cubemap
A solution to this problem involves binding to the local geometry in the procedure to calculate the reflection.
This solution is described in GPU Gems: Programming Techniques, Tips, and Tricks for Real-time Graphics by Randima Fernando (Series Editor).
The following figure shows a local correction using a bounding sphere:
Figure 5-14 Local correction using a bounding sphere
A bounding sphere is used as a proxy volume that delimits the scene to be
reflected. Instead of using the reflected vector
fetch the texture from the cubemap a new vector
used. To build this new vector you find the intersection point
P in the bounding sphere of the ray from the local point
V in the direction of the reflected vector
R. Create a new vector
R' from the center of the cubemap
where the cubemap was generated, to the intersection point
P. Use this vector to fetch the texture from the cubemap.
float3 R = reflect(D, N); Find intersection point P Find vector R' = CP float4 col = texCUBE(_Cubemap, R');
This approach produces good results in the surfaces of objects with a near spherical shape but reflections in plane reflective surfaces are deformed. Another drawback of this method is that the algorithm to calculate the intersection point with the bounding sphere solves a second degree equation and this is relatively complex.
In 2010 a developer proposed a better solution in a forum at http://www.gamedev.net. This approach replaces the previous bounding sphere by a box and solves the deformations and complexity problems of the previous method. For more information see: http://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/?&p=4637262.
The following figure shows a local correction using a bounding box:
Figure 5-15 Local correction using a bounding box
A more recent work in 2012 by Sebastien Lagarde uses this new approach to simulate more complex ambient specular lighting using several cubemaps and uses an algorithm to evaluate the contribution of each cubemap and efficiently blend on the GPU. See http://seblagarde.wordpress.com
Table 5-3 Differences between infinite and local cubemaps
|Infinite Cubemaps||Local Cubemaps|
The following figure shows the scene with correct reflections generated with local cubemaps.
Figure 5-16 Correct reflections