[Music] q usual reminder if you could adjust also turn off your cell phone while the presentation it'd be really appreciated so thank you for choosing us as your kickoff conference for this morning here's a small agenda so you guys understand a bit where we're going I'll go with the introduction of who we are in aid us and then Nicola will kick in with the work you've done for it men's game and a small conclusion afterwards so yeah I know it's a bit early so I'll try to keep you awake until the interesting stuff kicks in it funnels me I guess to my intro 37 year old proud father of two including an 18 month old little baby boy so this might only resonate to the parents of young kid in the audience but actually that's a break I'm adding right now so excuse my Canadian coal that I brought which is
changing a bit my voice so I'll try to be a bit louder so born and raised in Montreal by an Italian father and a french-canadian mother explaining the weird name that you're seeing up there and I spent almost 10 years in the gaming industry coming up from the aerospace and I spent most of those years in two studios in Montreal apologizing event so I as I extracted that information from a corporate deck but let me just draw your attention to some of those facts I just Montreal moved into his early teenage years celebrating its 10th anniversary not too long ago this month last month and over those 10 years in which I was an active participant for seven of those the studio built itself a strong reputation both in Montreal but around the world strong installment of beloved franchise such as yours ex-thief and Tom Ryder helped accomplish this positioning for the studio so points here in the next slide that really drives most of my attention and I'd like to get your
attention onto those as well of course innovation and creativity it's something that my department is highly involved in too but also honesty and respect the studio is creating great great titles from great IP yeah but it's always done through an enjoyable environment which is something very important for us respectful approach towards our most valuable assets which are the employees themselves great over time crunch policy for instances and strong balance between work and family or other activities a meaning wrote an interesting paper in the game industry biz not so long ago really recommended a few you guys are looking to learn a bit more about it let's say the straight the active community is growing older I know I'm growing older and we all have a changing expectations ours are our employers which is fine in the end and we've seen this trend in other studio so kindergarten and access to doctors at
shitara so irritated us were kind of a big family and I think a returning rate is a great indication of this so moving on to his labs we well it all started when our head of office regrouped a bunch of release resource to push technology barrier and act as a single unit we were folks from different field of expertise but we strongly collaborated together in the past which actually made a big key element to the success of this team and we knew each other strength we've had or fighting moment stress moment together tears everything were experiencing in in our own respective game teams right so then the rest are their three years anniversary we've contributed to three games that I shipped already collaboration with four different studio over three different time zones with all the challenges that this goes with 14 expert contribution went into lab
structure some went to went back to production and others and others as where we did over 18 delivered features and games over 24 ish a different investigation and year the year public appearance which is important for the studio itself so what are the expectations her labs pretty straightforward and easy to understand but not so easy to put in context and application if you were to ask me solve complex industry problems or at least grow our understanding of it it is its limitation and workaround there are problems that we're all struggling with independently from which Studios we we are were attempted to address the issue that is an actual problem were suffering with but we're also trying to keep aware of problems to come my team tried to invest the right amount of time and avoiding that these issues ever become a production showstoppers then sharing very important
aspect of my team as well sharing the knowledge gathered or proven solution to the sister studios to our position or different products so how do we operate industry problems some problems are well documented multiple solution were proposed by expert and big brains already but other or truly new issue that we need to investigate bill knowledge about it and a better understanding always researching for a different solution I'm aiming at resolving a problem with the first solution that emerge might actually show it weaknesses on the long run and might not be as solid as we'd expect search all possible solution best fitting a context constructive and collective an associative mentality as part of lab success this the collaboration and the team is super important actually regular exchanges chair rolling philosophy as I call it just poke your friends and put as more brain as possible into a problem
so the solution is just up to everyone standards we regroup inception prototyping and implementation under one roof so the idea is to prove its value quickly and fail fast enough and to find a being strong winner what makes sense and who we're innovating for is important to keep the focus on the clients need given we're working with different studio to not try to solve any personal fantasy that we might have in regards of a problems so let me guide through some of the team's achievement that we've done over the last three years of existence and we'd go first with rise of the Tomb Raider so the contribution in rise of the Tomb Raider includes the creation of six main graphic features that brought a lot of focus on the game those feature amongst some of the best technical achievement and rise of the Tomb Raider according to some press release and my
biased self we have led of course multiple direct and indirect promotion of the game technical achievement through major industry events such as the one you're seeing on screen also two years of continuous collaboration with olive labs member with the dev team we worked on over ten different graphic features including some that never made it in a game for many different reasons some are tied to the fact that production change its scope during during the dev cycles and we're kind of a client centric approach so they have the last call when we also tackled at the same time the integration of more mainstream feature that our innovation were requiring then moving on to doors X mankind divided of course we had a close proximity with the doors X team and it was a strong benefit the different
studio expert were accessible resources with collaborating with us along our collaboration just led the group in tackling some of the biggest challenge such as the one you're seeing there the iconic feature which is called titan shield and it's being yet also again mutual confidence allowed the game team to benefit from many of our previous research a role that it's expected from my team the sharing of technology whenever applicable and in worst case sharing the knowledge gained as broad as possible with that in mind labs worked hard in providing those X with unique pure hair integration motion blur volumetrics particle lighting R&D and so on and so on lots of knowledge shared with this group and our collaboration with the team is still active on a day-to-day basis so yes I touched on that aspect it's an important pillar for latest Montreal labs was always Italy involved in sharing back with the community some of her
innovations and additionally labs also Co promoted technology with industry-leading partners such as AM the Hewlett Packard and Autodesk only to name a few and now we're moving on to it men's game which is a bit the reason why we're all here today we were really looking forward to collaboration with the very talented iOS team the different work I've gotten us to collaborate for a little over a year altogether and we've had the chance to work on three different unique graphic features to them including the Ocean Technology that we're gonna discuss a bit later on yet again we naturally promoted the Ocean Technology in different ways which explain our presence here with you today so while Nicola come up on stage we'll just go and have a look at a prototype that we've done without sound
there's my song so hello good morning my name is Nikolai Lucia I am a technical artist in the
labs R&D group at Arras Montreal I've been in 3d for a little over 16 years already with about 9 years of that spent at Arras my background is mainly in graphics and VFX and on the technical side of things I'm mostly self-taught which i think is not very unusual for technical artists I'm also a proud dad and I can make a pretty decent loaf of bread so to start I'd like to note that this talk is not about a revolutionary ocean implementation but a practical one water surfaces are a difficult topic in real-time 3d and my hope today is that I can add to the community bag of tricks for creating real-time ocean surfaces during hitman production roughly around mid to end 2014 IO Interactive approached us to help create a solution for their in-game water surfaces specifically ocean rendering they wanted
an efficient lightweight solution that was up to par with current methods and could easily be implemented in a variety of contexts and have support for physics interactions from this applied and maps and reference I could also see other non-trivial features like transparent water an arbitrary shoreline and the fact that you could both walk along the beach and view it from a high vantage point with an unobstructed view to the horizon in several directions hence the name for this talk this implied a seamless transition of surface detail from up close to kilometers away physics interactions included things like floating are things like buoys small boats and ballistic impacts and this being a hitman game of course ragdolls aka dead bodies supporting physics became the initial focus as this would drive how the rest of the effect would be designed and function meaning the solution had to be CPU physics friendly
so we started looking at what skews my voice so we started looking at what was done at the time and there were a lot of implementations to choose from Assassin's Creed Black Flag we had a nice solution which sort of became my visual benchmark for the effect even though high seas sailing wasn't really necessary for us uncharted far cry and Killzone are some that stood out also all very nice solutions using interesting techniques and all with the different contexts and requirements of course there was the obligatory read of Jerry Tyson Dwarfs paper on ocean rendering which is the gold standard for ocean simulation and cinema VFX but also more recently applied in some triple-a titles there are a lot of open water solutions but unfortunately there's very few for beach interactions except for the offline and expensive SPH or flip particle
simulations and it's very difficult to find any solutions that offer a seamless integration of both open water and quality Beach interactions solutions that tackle open water well usually have limited Beach interactions if any and the effect sort of lives inside of a tank a lot of the times the water displacement simply clips the beach or is attenuated by distance field or water depth texture just a spoiler alert I don't think I've completely solved this issue myself but hopefully I've taken some steps in the right direction so to start what do we need to make an ocean surface well we need a surface of course that seems obvious but what kind of surface is it a procedural or a static how is it parameterize how is the geometric screen density handled open water is simpler but what about our Beach and how to transition from beach to open water common choices for surfers generation are simple static geometry which is a
user authored mesh screen projected grid or a system of multi resolution patches the screen projected grid sorry static geometry can be okay if you have a advantage point and are able to statically distribute from a known source from a known point this isn't our case at all and we wanted to avoid handling a large system the screen projection grid is a popular choice for good reason since it's by nature restricted to the frustum no frustum calling necessary and screen geometric density is constant and distribution is more or less ideal parametrizations can be an for sure lines can be an issue however as know you've YZ or other vertex data can be localized on the mesh localized data has to be then stored in an implicitly mapped textures or by other means patch systems incur some system overhead and requires seam stitching at the
borders where patches of different resolutions meet they also have the same parameter ization issues as the screen projected method Hardware tessellation was something I had wanted to apply to water for a while at labs we had implemented it for our Titan shield effect and afterwards more extensively in this no deformation effect in rise of the Tomb Raider during the development of that feature we had tested Hardware tessellation against a comparable dense static mesh and found a hardware test elation to be a much better performance using tessellation would allow for perimeter area perimeter J the perimeter is a ssin I have problems with that word and arbitrary to LOD topology along the base mesh were necessary meaning I could UV map my shoreline if I required to do so also transition and geometric resolution would be automatically handled so no stitching algorithms or LOD systems are
necessary so for the ocean we're using an authored mesh as a base for tessellation but as a very sparse hull mesh for tessellation we employ a simple distance to camera adaptive tessellation technique with a non linear fall-off tessellation density can be kept constant to a given distance after that possibly due to angle of ended angle of incidence I found that I could have geometric density fall-off much quicker than linearly with little to no noticeable effect in quality tessellation is also kept to within the camera frustum in the shader the camera distance function is computed in the vertex shader and passed on to the other stages for modulating the tessellation factor displacement amplitude and other shader effect weights as for the final test elation factor there are a lot of guidelines for tessellation sorry most
simply state to keep it below a certain number but this doesn't really take into account the initial geometric density my base mesh has huge triangles so this was not really helpful the one guideline I found and I found most useful in stuck to was keeping screen density in check that is to avoid having triangles smaller than 16 pixels screen area in order to maintain rasterizer efficiency I found this info in an AMD developer presentation the AMD GNC architecture a crash course by Lela ma when setting edge and face tessellation factors only edge factors are handled face factors are simple or simply an average of the former with the exception of the beach variant base match will shall explain later the base geometry is very sparse it's a radial ocean mesh roughly 800 meters across divided into hectare patches so 100 meters by 100 meters the
total mesh diameter was found by placing circles representing the desired view distance at several extreme positions in the map and then encapsulating those within a larger circle representing the final extents of the ocean geometry basically of basic geometric density before tessellation is one vertex per every 10 meter keeping a uniform distribution of triangles will allow to better control tessellation density permanently occluded geometry can be removed but caps are kept on the 10 meter grid in or keep the uniform triangle size the beach mesh is a special case here we want UVs and vertex colors for Shore waves we also want close to poly topology match with the shoreline so the 10 meter grid goes out the window here for modeling I found the best I found it best to model both the water and the floor of the
shore using the same water line curve this allowed for matching topology and you v's on the shore floor which could subsequently be synced to the shore the shore wave water effect and use for wets and animated effect we still want to have the borders of our beach patch mesh match the 10-meter grid as to avoid tearing during deformation however now we have a problem for tessellation this relation will divide all triangles by the given amount no matter what the triangle size so keeping to a 10 meter grid kept a homogeneous triangle size and perfectly uniform subdivision but now we have smaller triangles with the same tessellation factors giving us some very dense and unnecessary geometry and ultra dense geometry is bad for the rasterizer efficiency as we saw so we want to keep tessellation density relatively uniform and to do that we
need to encode a tessellation bias value into a vertex color data for the beach mesh here in the image I've applied a color ramp so that it looks cool but really it's a scalar value for water but for water patches marked as beach type this vertex data is used in the whole shader to bias the tessellation factors to find the bias value we process the geometry in our GCC and find each triangles area and going back to our 10 metre grid we know that a normal triangle has in an area of 50 square meters 10 by 10 Triangle area and therefore we can normalize to that value this will give us a zero to one size ratio that can then be encoded into a vertex color channel ratios bigger than one are clamped so when applied the smaller triangles are proportionally tessellated to a lesser degree so we have a surface and now we need a method to move the points around
this placement is pretty common in games now but for water it should be noted that a height function is really not sufficient water churns and moves and lateral movement is very necessary to properly sell the effect so we're not really looking for a height displacement but rather a vector displacement just to note on compute shaders we did quickly look into a computer approach but ultimately decided against it fearing latency issues that would incur when getting the modified mesh back from GPU in order to perform CPU physics maybe we could have used GPU compute to generate vector displacement and normal maps at runtime but this would have brought with it a fixed tiling pattern that would have to be managed we also wanted to avoid doing CPU texture fetches for physics as much as possible black flag had a good implementation using I believe offline generation offline generated vector displacement
maps but we ultimately did not explore this route since we wanted a stateless function other than vector displacement Maps what other methods have been applied uncharted made use of low frequency Gerstner waves along with higher frequency or what they call particle waves and an additional mega way of the former are mine Armande did not call for such rough seas but I really like the idea of artist placeable waves we did look into FFTs or a festival near transform ocean deformation as outlined in mr. jerry tesam dwarfs 2001 paper simulating ocean water fft waves are maybe not a good name the fast Fourier transform here is a component of a larger set of equations based on statistical models found in oceanographic literature there's a reason why FFT waves are pretty much the gold standard for ocean simulation in cinema and this is the method produces some
very convincing results and although advancements in available CPU GPU power in games hardware have recently made FFT waves more viable as seen as the more recent Just Cause 3s and video wave works implementation they do remain computationally intensive and for a poor technical artist like myself a bit mathematically intimidating math complexity put aside though FFT waves have some issues to consider by nature of existing within a domain they tile both spatially and periodically the spatial tiling can't be fixed this can only be managed they can be difficult to get rights and the generation of normals or CPU side surfaces for physics requires even more FFTs for very water centric games the costs may be worth it but for us I went back and revisited
Gerstner waves to drive our effect starting from the well-known GPU gems article effective water simulation from physical models by Mark Finch despite being despite maybe being considered obsolete for cinema at least there's no waves have some nice properties that shouldn't be low shouldn't be overlooked Gerstner waves are computationally efficient and the function is easy to derive in order to generate a surface normal and tangent basis they might not be as realistic as a 50 waves but they can also offer convincing results given the proper setup and perimeters although there is also a periodic periodic element to Gerstner waves each wave is independent and not tied to a domain so it's easier to manage repetition one easy way to break repetition is which we implemented is to employ a low-frequency phase noise texture to the waves the deformation effect was separated into
three categories or water behaviors if you will there's the general generic open water waves areas where there's no directionality or influence landmasses then you'll have the closer to the shore the coastal waves would still be open water but here you would start to feel some directionality and conformity to the coastline and Beach waves of course where water actually meets the makes contact with the landmass and the contact line needs to be handled somehow water towards the horizon has no displacement and we'll talk about that later open water is the generic non directional motion of the water this is the base layer for the effect it's a mix of eight Gerstner waves arranged in a way to cover all directions without cancelling each other out and create a wave motion not biased to any particular direction so while we're talking about mixing Gerstner waves there's a few points I can share
on the topic if you're like me your first instinct would probably have been to mix many wave fronts and just randomly pack them on as much as you can thinking more waves means more detail right not necessarily what happens is like if you think of it like adding noise noise on top of noise values will eventually converge to the median value and in our case since we're doing bi-directional displacement the median value is zero so the more wave fronts I would add to the system the more my water surface got flat basically all of the Delta positions were cancelling each other out so more is not better not in a similar not at similar frequencies at least which brings the second point separate your wave fronts into frequency groups for example we have a low frequency group of three wave fronts and a high
frequency group of five wave fronts generally the lower the frequency the less wave fronts you want to use and doing this separating into groups I found is a good way to manage complexity of the effect separating into groups allows to unify controls for the waves in that group and simply apply variance to the individual waves from the original controls meaning the overall effect is easier to control for artists additionally you may want to skip a high-frequency group when sampling positions on CPU for physics or any other instance where you would need a low fidelity height sample and finally the obvious you want to break symmetry as much as possible so odd numbers are your friend and add variants wherever you can and avoid having anything on axis our three brave ones our three wave fronts are radially distributed and our five high frequency wave fronts start from the
reverse direction so no directions in the same group overlap and no directions intergroup will overlap either conceptually ocean surfaces are composed of an infinite amount of random wave fronts but realistically waves interact they collide they exchange energy they die they separate emerge of course our water waves don't do that they simply add this is also the case for an FFD ocean surface I believe I'm inclined to say that these are not technically simulations like you would have with SPH or flip particle solutions where a finite data set is updated through a solver we have no data set to update but we can control how the waves are added and base positions from which they're computed so I find there's basically three methods to sum Gerstner
waves in reference to when they get to applied to the base sequentially some delta positions or some deltas by group the first method is to simply sequentially add the waves so that each wave is computed from base sorry so that each wave is computed from base from positions deformed by the previous wave this isn't a great method and is difficult to control the the reason I dislike it is that the first wave is deformed by all subsequent waves but the last wave isn't deformed at all so the the weight of each wavefront is not equal in this case the second method has seen in GPU gems Gerstner wave surface equation is computing all wave fronts from the base position and then adding the sum delta positions in one go this
way all waves have an equal effect however since they're all computed from the base position the waves don't really deform each other which is a nice effect to have the third method method takes advantage of the fact that we've separated our wave fronts into frequency groups in this method we sum the deltas but we apply them to the base position between the groups so the base position here is deformed by previously applied groups and we go in descending order of frequency which is important this is so that small waves get deformed by larger waves as would make sense in reality the bigger the wave the more inertia I also found that this method I also found this method to be much less sensitive to pinching at the crests which is a common problem when using Kershner waves then simply summing the deltas and still
allowed the waves to be deformed by each other like with the sequential method but in a much more controllable manner for coastal waves you want to have a more directional wave front fitted to the curvature of the shoreline to do this we first looked into perimeter perimeter rising the mesh but that would require a lot of unique assets and the results were not really that great it was also difficult and tedious to have localized control for things like intensity speed things like that we also wanted a friendlier process than baking into textures and iterate inside that process inspired by forward lighting I had the idea to create a simple system of artists placeable wave objects these objects work a bit like forward lights in the shader each wave object adds three wave sampled per
vertex and the shader allows for up to four wave objects per mesh or per hectar patch if you remember the worst case scenario is there for 20 wave samples per tessellated vertex each wave object holds a set of parameters and passes these to the shaders via constants this allows the user to control area of effect direction wave amplitude and curvature of the wavefront in order to support curved coastlines it's possible to warp the wavefront along the wave direction the wave curved perimeter allows bi-directional warping in order to obtain a convex or concave wavefront this also helped to reduce the number of wave objects necessary to follow the shoreline so we solved the tessellation issue for arbitrary geometry and we don't require crashing waves which makes things much easier but
how do we get the water to slide onto the beach the player can walk along the beach right up to the water so just letting the water clip is not an option attenuating the deformation to a static position along the shore is common like we saw either by depth texture or just freezing it to a static position but I really wanted to go for that sliding effect and to do this the beach interaction relies on a big depth slice of the scenery which is sampled by the ocean shader in the beach variant and allows for the vertices to know the height of the beach at their location during displacement this allowed to have the ocean mesh slide onto the beach when moving this is as simple as selecting the maximum height between the displaced vertex position and the sample beach high full scene heightmap sounds a bit intense but we know the water height so
from there we can cut around that and maximize depth resolution in the small strip of height that we really need the height map only stores a 4 meter wide layer of height 2 meters spread from the water height which allows for an acceptable height resolution of around one and a half centimeters when packed into an 8-bit texture alpha for area roughly 4 texels per square meter seems sufficient in our case since we now have this texture covering the map we also encode a distance field from the shoreline which we'll use for masking foam okay onto rendering water is a volume and because of that a lot of the shading effects are not on but rather under the surface so if not volume rendering which in games is most likely the case you have to at least process what's behind the water surface as per
the requirements of the i/o mandate we went for a lightweight method and thankfully we did not need to manage going into or under the water surface shading parameters were mostly simplified to absorption and scattering represented using a lip texture mapped to linear view depth the shader also made use of a quarter resolution render target for underwater geometries allowing blurring refraction caustics and optionally dispersion for the underwater plate we render the scene into a quarter resolution off screen buffer before the translucent passes from here we reconstruct world position from depth in order to generate world coordinates overall of the scene geometry the caustic effect itself is very simple it's a static caustic render just a single image distorted by a panning low-frequency normal map it does the job pretty well and besides the effect will further be perturbed by a surface refraction we then use the
generated world pause as UV is in order to project our cost over everything underwater we don't really care about masking our distance here elements above the water obviously don't won't be visible in in the underwater image and elements far off in the distance will be obstructed by absorption after the caustics are applied we make a copy of the texture and blur it so we have a blurred and unblurred version of our underwater which can later be blended using depth further effects will need to be applied in the surface pixel shader since we need the surface pixel location this is because we can't just use depth we need depth from surface when rendering the the surface in the pixel shader we get to UVs based on world position pre and post
deformation pre deformation coordinates will unintuitive ly be deformed by wave motion so this is what we want to use to map surface textures like form and normals I do use an offline FFT ocean surface in order to bake normal maps this is really the best way I find to get water normals the periodic nature of FFTs works to our advantage when baking normal Maps since they tile perfectly we use these wave normal maps to represent the highest frequencies of waves at the top on top of the deformation effect once we have normals we can quote-unquote refract or UV s for sampling our scene depth and underwater plates and in the pixel shader we also have the pixel depth so we can compute eye depth from surface obviously if you want to accumulate an effect like absorption you don't want to start from the eye but rather the point at which
the eye ray intersects the water surface with linear distance from surface we then map both blurred and unblurred underwater plates and blend them along depth to a given input distance so why blur the water is that is that really PBR probably not but blurring I find helps a lot real ocean water has a lot of effects going on underwater haze micro refractions from very small ripples at the surface and under the surface from microscopic bubbles dispersion and other difficult to to create effects I find that blurring works visually to convey the impression of a different heavier medium below the surface and I find without this affect water rendering often just looks like it's just air behind the deforming glass pane so after this we apply our absorption and scatter
it absorption works along I DEP from surface and is multiplicative the far point is black as that would be where the light extinction occurs underwater for ocean water this depends on the wavelength but generally 200 meters is the point at which most to all light is completely absorbed this can be adjusted artistically of course scattering is a more complex effect and doesn't really work along I depth but for simplicity and efficiency that's exactly what we did the downside to look textures is the iteration rate when tweaking values in my case I made a little fun in substance so that I could rapidly regenerate the texture when iterating we then apply our cubemap reflections and specular highlights and an SSRI pass is done in
post for foam its mask using both a shoreline distance field and a vertex height map computed from our waves while accumulating accumulating height in the domain shader total added height is tracked in order to normalize the final height value for texturing a trick is taken from black flag multiple densities of foam are packed into a single texture and mixed together in the shader depending on the gray value of the surface foam mask effect supports dynamic surface ripples from interacting float interacting physics objects as well as ballistic impacts these don't deform the surface but rather contribute to the pixel normal what's cool though is that they contribute to underwater caustics as well the SSR method mentioned is is a fast simplified no raytrace SSR which uses the plane equation of the water surface rather than the real surface and normal
for the beach for the beach waves we already have our sliding water effect from the deformation and the beach mesh also has UVs along this along that strip of polygons so to complete the effect we use a two-phase cross-fading UV animation to desync the waves along the length of the shoreline the cosine of UV x offsets the phase of the animation and because we've matched the topology of the water edge in beach we have matching UVs on the sand so we can implement the same animation on the sand in order to achieve a wet sand effect for the horizon although the base geometry extended out several hundred meters the edge of the mesh could be seen especially from certain elevated vantage points one traditional solution is to simply create
a giant grid and scale it until you just can't see the edges anymore this however requires a large fire clip value which does affect depth distribution so instead I recycle the trick I use for mapping procedural skies for lack of a better name i dub the effect horizon mapping simply because it generates planner coordinates to the horizon line I think this term might already be used in CG somewhere so if anyone has a better name for it let me know here we use the world camera vector and world camera position and assuming assuming a y up Quartz's for this whole presentation I've been using Y up by the way we divide camera vector X Z by Y which gives us infinite planar chords on the XZ plane their camera centric though so we are just using world camera position to compensate the result is planner
coordinates that match world coordinates perfectly so if you're using world coordinates to map textures such as is the case for our ocean the textures map to the horizon mapping should line up perfectly and there will be no visible seams assuming the pixels are shaded the same way of course normal maps here don't require transforming other than swapping Y frizzy or other coordinate adjustments since we're already aligned to the world axis the world camera vector on the support geometry should be exactly the same as on our virtual plane so with the map normal we can get a reflection vector on the Virtual surface as well this gives us enough to shade the surface and match our real ocean geometry because the effects support geometry can be relatively close the cameras far plane doesn't have to be at a very high value which is much better
for your scenes depth distribution pixels above the horizon line are clipped simply using camera vector Y and the virtual plane is shaded using a simplified version of the ocean shader reception of the effect was pretty good the placeable wave modifiers were especially liked here we can see them used as waves from the waterfall the effect proved versatile enough to be used in many context across the game one nice example here is the bubbling water and in the natural springs I believe they cleverly used inverted Gerstner function here and it works pretty well many sites context as well anything from
small pools to large lakes or oceans of course eventually you have to ship the feature still a lot of interesting ideas to explore and lots of ideas come after I step back and I'd like to share some of those one thing I wish I had better was better Shore waves our effect did not call for a search for surf waves or crashing waves but I still wish we had a bit more deformation in there may be more Gerstner x' would probably be difficult to control for Shore waves may
be animated displacement Maps would probably be a better idea given we already have the UVs and we already have the use the animation some other things to explore would be Alembic it wasn't really an option for us at the time there was no engine support but Alembic offers some interesting avenues to explore mesh caches could allow to pre-compute and playback complex simulations of surface deformations deferring the computation cost to bandwidth precomputed crashing waves simulations would would probably be very nice lots of things to solve and explore on this end though bandwidth cost would be a question how to apply the mesh to a mesh with a dynamic resolution would be another how to blend olymic Olympic deformations together with other deformations would be a good question to solve also better subsurface lighting or
scattering like I said earlier in the talk absorption works well along linear eye depth from the surface but not scattering that's a complete hack volume McCrae March from the surface would have been nice here maybe in the quarter resolution buffer rather than using the wave height just assume the water level as a flat plane and go from there and finally better foam if you look at photos of ocean surf you'll see that the the underwater area right where the foam is is much brighter usually and that's that's because foam is is really not strictly a surface effect there's a lot of air bubbles mixed in just under the surface which which causes a whole bunch of effects right under the surface in that area so I don't think you can really get realistic foam until you also
capture this subsurface effective foam possibly Ray March through a foam height map from the surface or maybe a simple parallax effect with a blurred version of the foam would suffice so that's all for me now pass the floor back to GM yeah well I think while Nick while Nick and I are very happy to be here were representing a whole team's work so I like just add a few names over here but also include a does Montreal an IO Interactive complete team who assisted us along the way it would have been a bit of a cheat not to mention them and of course we are hiring and looking for very talented and creative people especially in my team but also at other department team project and studios so make sure to come around and see my friend Olivia ville who's in front of her here at Neyland
all Lendl any requests or explained to you any possibilities that you may have so i know we do have a bit of time for a question but there's two or three reminders that I like to give you guys the evaluation it'd be really interesting if you can just fill those evaluation because it helps us shape the content for our year the year appearances and make sure that it was relevant or what would be required to be changed in upcoming presentation along with if ever you guys have tons of question there's a wrap-up room that we can head to which is in a west wall West Hall level too and we're gonna put those slides on GDC vault I swear any question I I have a small question so first thank
you very much for the talk to be honest I'd I'm very not suspicious into that so it's not a technical question it's more about how do you integrate with existing game and shine and does all those juices been working with of their own game enjoy no there is something else and how do you mix this alert Jian replied sorry the question was how do you implement with different game engines and further question was does our studio support many engines and everything a legend answered the multiple engine question for implementing one of the goals that that drove a lot of the decisions that we took for this effect was really to have a drop in effect so we it was very very much as least least invasive as
possible I don't know if you understand we didn't want to branch into all these subsystems of the engine we just wanted to use like a generic technology something that we could just drop in and it works and I think we were successful in that I'll let you answer for the multiple engines yeah we do have multiple engines in our different studios that is Amanda that is given to my team to share the knowledge or sharing engine were sharing technology were sharing features but there are different engine in different studios so it asked the team to be very versatile in regards of and I think it resaw it reach also the point that I was mentioning to make sure to always focus your work to your clients needs so they have a different code base they have specific needs as Nicola mentioned we weren't in for open and so on because it wasn't really demanded so yes multiple different technology all the best all right my question is about how
do you tune the level of investment into realism as you're working on something like this because for instance I could see like you could go deeper or you could go less detail less realism and and if you go deeper there may come a point where other things are less realistic anyway so beyond that point you're probably wasting your time or something so do you have any tips or guidelines that you use throughout this process we'll add you in decisions it's basically a cost-benefit analysis we had a we were implementing an effect into a game that was pretty much well along into production so we couldn't just you know eat up the whole budget and you're correct about you know making this super realistic effect and then it drops in
but the environment and everything is not as as realistic and as you may know also the the more you go up in quality the more the cost is usually exponential so we did have a budget in mind we wanted to stay light and efficient we made a lot of decisions like for instance the scattering was just mapped along view depth instead of doing a proper subsurface effect you really have to take a step back and and see that you know you're making a nice effect but it's not the game so you want to make something that supports the game or we're also exposing a lot of those parameters to the team itself as they've used it in many clever ways we're also allowing them to just tweak it according to their games were were we have the luxury in our team to just push past the good enough which is often where we're aiming for and developing features for games so that allows my team to go a little bit
deeper but in the end just keep focused on the client and needs and gives him the the right tool so he's able to achieve his vision we only have three four minutes I was curious if you had any kind of information about particles and automating that kind of aspect of water that's pretty common or if that was not really part of your solution Utah he's asking about generating surface spray I guess yeah I think we we kept to just textured foam like I said we this wasn't like a high seas battle like a sea black flag where that effect would probably be more called for we had kind of soft seas nothing strong enough to generate that type of effect but if you were to look into that I guess I would start with height and the tangent basis so you guys are obviously running in frame can you
give me an idea of what the performance cost and the memory costs was that you have ended up shipping obviously it's gonna vary on the scene and everything but just some rough metrics rough metrics I'm sorry I don't have any I I didn't think of bringing numbers but we didn't break the build and we and we didn't bust performance so I guess we're good and they'd use it everywhere so I guess it's performant enough I think the SSR was quite optimal yeah it was extremely optimal and they actually used the the the the water surface effect much more extensively than I originally planned so that probably says something for performance so given that we're allowed to put our slides up to March seventh we'll also add the reference as a last slide and it'd be interesting just to put a few numbers in the and the P in the PDF so
thank you very much for coming to our talk guys you you
Auto-generated captions from YouTube — names and numbers may be misheard.
Game Developers Conference · 2026
Game Developers Conference · 2025
Comments