Reflektioner
Om du har märkt det så är marken något reflekterande. Detta görs med en blandning av enkla knep. Vi har inte att göra med ray-traced rendering här så vi måste använda geometri och shaders. Ett sätt kan vara att använda schablonbufferten medan du renderar för att använda marken som en mask och invertera all geometri längs y-axeln. Istället är marken gjord av ett plan där vi skapar vår lokala klarfärg så att säga. Byggnaderna är lite genomskinliga och invändigt har de samma färg, men ogenomskinliga, så de kommer att fungera som sin del av markplanet.
Nu kommer geometrin på marken att se ut som reflektioner om vi justerar genomskinligheten på markplanet, utan att behöva något extra. Byggnaderna är bara dubbelt så höga med mittpunkten i nivå med markplanet, så inget behov av flera geometrier där. Och att animera höjden blir automatiskt korrekt. Extraikonerna är lite mer speciella. Dessa flytande föremål dupliceras och placeras på markplanet. Eftersom den studsande animeringen hanteras i vertex-shadern kan vi bara invertera y-skalan, och nätet kommer att animeras korrekt.
Ljusets reflektion reflekteras också på marken. Den här rutan rör sig upp och ner, så reflektionen kan inte bara vara en inverterad geometri, det ser fel ut om reflektionslådan bara skalar. Istället så måste den vara i samma höjd som den synliga delen, men utan att förvränga uv:erna. Ett plan med samma material som videon i kuben placeras under marken, inuti reflektionslådan som nämns ovan. Sedan justeras uv-koordinaterna så att de matchar rutan ovan, under animeringen. För en snygg gradientfade så placeras ett andra plan framför, bara ett par enheter bort. Jag kunde göra detta i en skuggning men jag ville återanvända materialet i videokuben.
Tricket här är att göra denna gradient i samma färg som marken, så att den smälter ihop med reflektionen. En duk skapas och en gradientfylld rektangel ritas med markens diffusa färg och alfa från 0 till 1. Jag kämpade lite med alfa här och lösningen kanske inte var bäst i klassen, men när det gäller genomskinliga föremål och djupsortering så hamnar jag alltid i konstiga iterationer, ibland fungerar det och jag behåller det.
Det märks knappt, men en extra gradient läggs till i den nedre delen av videoskärmen för att återspegla markens färg.