80 likes | 225 Vues
This document explores innovative methods for rendering water in real-time graphics using per-vertex and pixel shader techniques. It covers sinusoidal warping of positions and normals, dynamic reflection and refraction maps, and the use of Fresnel calculations for realistic transparency and lighting effects. Emphasis is given to advanced shader programming practices, including matrix operations and dynamic texture rendering. The approach results in visually stunning water surfaces that reflect their environment while appearing clear from certain angles.
E N D
Just add Water
Early Attempt • Per-Vertex sinusoidal warping of position • Per-Vertex sinusoidal warping of normal • All Lighting Per-Vertex • VS/PS 1
Next Attempt • Still VS/PS1 • Per-Vertex creation of “Tangent-Space” Basis • Scrolling Normal-Map coordinates (scrolled in VS) • Normal-Map sampled in PS, then put in world-space and reflected to sample Environment Map • This is possible with the magic PS instructionstexm3x3pad t1, t0_bx2texm3x3pad t2, t0_bx2texm3x3vspec t3, t0_bx2 • This performs a 3x3 matrix multiply, reflection, and cube-map lookup; AMAZING! • This is impossible to do without dropping into the assembly-style shader programming
Next Attempt (cont.) • Additionally, some per-vertex light color computation (Gouraud-style) • Also added “reflection-map”, perturbed in VS and sampled in PS using a second pass • This required rendering the reflected scene to a dynamic texture, and implementing per-pixel clipping using the instruction “tex-kill” (simulated user-clip planes) • This texture is the “reflection-map”, which is then projectively-textured onto the water geometry
3rd Time’s the Charm • VS/PS 2 (ahh… more than 8 instructions in the pixel shader! Yay!) • No more sin/cos stuff • 4 scrolling bump maps, scrolled in different directions and speeds • Reflection Map (render to texture, 1st pass) • Refraction Map (render to texture, 2nd pass) • “Real” User Clip Planes • When using Fixed-Function Pipeline, user clip planes are expected to be in World Space • When using Programmable Pipeline, user clip planes are expected to be in Clip Space… go figure! Good ol’ DirectX
3rd Time’s the Charm (cont.) • Render everything for real, and then draw water using reflection and refraction maps (3rd pass) • All perturbation occurs in pixel-shader • All 4 scrolling normal maps are sampled, the normals summed and normalized into single normal • Projective reflection and refraction map coordinates are perturbed by this normal • each is perturbed with a different scaling factor • Reflection and refraction maps are sampled and combined with their respective “water color”
3rd Time’s the Charm (cont.) • Fresnel term is calculated using the angle between the normal and the view vector • Creates for much more realistic “transparency” and lighting effects • Fresnel term defines the blending factor between reflection and refraction map • Looking straight down at water, water should look clear • Looking across/from the side, water should be highly reflective
Where the Water Meets the Sky • Sky Dome • Needs sphere geometry • Possible with VS/PS1 in a single pass for sky color, sun, and moon • Uses projective texturing for sun and moon • Additional Normal mapping for moon • ADDSMOOTH color blending for sun • Prevents overflow for highly saturated colors when using additive blending • Instead of usual blending of ONE*SRC + ONE*DEST • Uses ONE*SRC + DEST*INVSRC • Base sky color uses simple 1D gradient function • Atmospheric color scattering performed in Vertex Shader