Jason Deacutis
jasondeacutis@gmail.com
- Gunner, HEAT, PC! (GHPC)
- ArmA 3 - Community Upgrade Project
- Personal Projects
- 3D Art
Early Access "Cold War Gone Hot" tank simulation game.
GHPC is short for "Gunner, use High Explosive Anti Tank round on enemy Personnel Carrier!" (yes, its nerdy)
Gunsight crosshairs are integrated with the ballistics system, elements are procedurally placed to ensure projectiles always hit their mark as we tweak our amunition over the course of development. Supports both "old-fashoned" light-blocking reticles, & holographic/reflex reticles. All reticles were meticulously recreated from their real-world counterparts, using written & photographic reference (often difficult to find).
{% capture c %}{% include image.html src="/content/GHPC/Reticles/reticles_small.jpg" href="/content/GHPC/Reticles/reticles.png" inline=1 w=980 h=490 %}{% endcapture %} {% capture f %} Reticles for T-55, BRDM-2, T-72, AT-4 Spigot, TPKU-2B (Russian Commander Periscope), TOW, & M60A3. {% endcapture %} {% include figure.html content=c footer=f %}
{% capture c %}{% include compare.html a="/content/GHPC/Reticles/t72-day.jpg" b="/content/GHPC/Reticles/t72-night.jpg" labelA="Day" labelB="Night" pos="0.55" style="width=100%; aspect-ratio:980/551" %}{% endcapture %}
{% capture f %}Nearly every gunsight since WW2 has an internal light for use at night
(reticles are actually white!).{% endcapture %}
{% include figure.html content=c footer=f footerStyle="max-width:600px" %}
{% capture c %}{% include image.html src="/content/GHPC/Reticles/t55_labeled_small.jpg" href="/content/GHPC/Reticles/t55_labeled.jpg" inline=1 w=980 h=729 %}{% endcapture %} {% capture f %}Russian T-55 gunsight with labels{% endcapture %} {% include figure.html content=c footer=f style="max-width:720px" %}
{% capture h %}Stadiametric rangefinding allows quickly determining the distance of a target based on its apparent size.{% endcapture %} {% capture c %}{% include image.html src="/content/GHPC/Reticles/stadia_small.jpg" href="/content/GHPC/Reticles/stadia.png" inline=1 w=605 h=200 %}{% endcapture %} {% capture f %}T-72 stadia showing a US M60A3 at 500 meter distance increments{% endcapture %} {% include figure.html header=h content=c footer=f %}
Approximation of Infrared light, used to identify heat sources such as vehicles & infantry. Vehicle engines, gun barrels, & tracks are heat sources that can change temperature independently. In addition, the sun's position is used to determine the ambient environement temperature. Surface details are obtained using a semi-physically-based light model: surface brightness, roughness, & metalness are used to estimate heat emittance, determining how bright or dark it appears in thermal imagers. This achieves decently realistic results without needing much manual labor.
2D map rendering is harder than you'd think. GHPC has terrains over 8x8km in size & players need a zoomable map.
A static image needs to be very high resolution, it takes a lot of space, & even still it doesn't support a lot of zooming.
A mesh based map allows infinite zoom, but may be difficult to generate or require level of detail for performance.
Signed Distance Fields compromise & allow low resolution textures to encode vector graphics that can be infinetly zoomed. They enable easy styling of borders & anti aliasing cheaper than traditional triangle MSAA. The SDFs are procedurally generated based on the forest, road, & building masks that we already use for vegetation generation & terrain materials. There's a lot of room for optimization, but there was no need given how fast it was already running (<1ms).
Realtime sky simulation, based on a simplified solar system model. Takes into account the map's global coordinates. Includes seasonal sun elevation, moon phases, & earthshine. The moon is also simulated as a light source & its brightness is affected by phase.
{% capture c %}{% include image.html src="/content/GHPC/Sky/sunpath_small.jpg" href="/content/GHPC/Sky/sunpath.png" inline=1 w=702 h=394 %}{% endcapture %} {% capture f %}Sunpath over the course of a year{% endcapture %} {% include figure.html content=c footer=f %}
{% capture c %}{% include image.html src="/content/GHPC/Sky/moon2.gif" inline=1 w=615 h=122 %}{% endcapture %} {% capture f %}Moon phase cycle {% endcapture %} {% include figure.html content=c footer=f %}
{% include embed-youtube.html id="kvQDc_CfAFo" %}Developed the first iteration of the driver AI, allowing vehicles to navigate to a destination while avoiding obstacles.
Developed the first iteration of the AI vision occlusion. A mesh is used to determine how obscured a target is. PhysX raycasts are very efficient for static meshes, so this actually turned out to be very performant. Houdini procedurally generates a mesh using the forest masks that we use for procedural vegetation placement. The masks are vectorized, extruded, & the triangle count is reduced to reasonable amounts (<10,000 tris).
{% capture c %}{% include image.html src="/content/GHPC/Vision Collider.jpg" inline=1 w=1905 h=893 %}{% endcapture %} {% capture f %}Red is the invisible mesh. This prevents AI from seeing through forests.{% endcapture %} {% include figure.html content=c footer=f %}
ArmA 3 - Community Upgrade Project
Crowd-sourced mod to port content to Arma 3 from preceding games (military sandbox).
I worked as a small part of a massive team of passionate community members.
1-Month stab at recreating Minecraft for fun. Implemented dynamic voxels & infinite terrain. {% include image.html src="/content/MC-sunset.jpg" href="/content/MC-sunset.png" style="width:100%; aspect-ratio: 16/9;" %}
A N-Body simulation simulates all objects as sources of gravity. For example, all the stars in the Milky Way galaxy pull on the Sun, & the Sun pulls on all the stars. This is particularly expensive because the calculations increase exponentially with the body count (O(n^2)).
Raytracing, Pathtracing, & Raymarching all form images by simulating rays of light entering a camera for every pixel. They're compulationally expensive compared to traditional triangle rasterization, but they can handle much more complicated graphical effects. They are not necessarily challenging to program, but they are difficult to optimize. All renderers here were made from scratch in Unity running on a GTX 1070 Ti without the use of RTX.
{% capture c %}{% include image.html src="/content/Shader/Raytracer/RT.jpg" href="/content/Shader/Raytracer/RT.png" inline=1 %}{% endcapture %} {% capture f %}Traditional lights are simulated as "point" sources, meaning they are infinetly small & cast sharp shadows (rare in reality). Raytracing can properly simulate light sources with shape & size, creating soft shadow penumbra.{% endcapture %} {% include figure.html content=c footer=f footerStyle="max-width:850px" %} {% include video.html src="/content/Shader/Raytracer/soft.mp4" %}
{% capture h %}Pathtracing is an extension of raytracing where every collision "bounces" the light ray. When a ray hits a mirror, a ray is reflected. An impefect mirror defocuses the ray into a cone (blurry reflection). A white wall defocuses the ray across a hemisphere. These bounces results in a grainy image when too few rays are used, but given enough time the result is a near perfect simulation of light.{% endcapture %} {% capture c %}{% include video.html src="/content/Shader/Raytracer/PT.mp4" inline=1 %}{% endcapture %} {% capture f %}Notice the slightly blurry reflections, & indirect illumination of the sphere’s dark side from light bouncing off the ground.{% endcapture %} {% include figure.html header=h content=c footer=f %}
{% capture c %}{% include image.html src="/content/Shader/Raymarcher/raymacher1_small.jpg" href="/content/Shader/Raymarcher/raymacher1.png" inline=1 %}{% endcapture %} {% capture f %}Raymarching has a high upfront cost, but it can also achieve complexity otherwise impossible with triangles (extreme non-realtime example).{% endcapture %} {% include figure.html content=c footer=f %}
Disclaimer: All reverse engineering I conduct is purely for educational purposes. I do not claim to be responsible for any of the original work.
{% capture c %}{% include compare.html a="/content/Reverse Engineer/BF3/bf3_alley_ingame.jpg" b="/content/Reverse Engineer/BF3/bf3_alley_blender.jpg" labelA="BF3" labelB="Blender" inline=1 %}{% endcapture %} {% capture f %}An alley (from the first campaign level) imported into Blender without textures for analysis.{% endcapture %} {% include figure.html content=c footer=f %}
{% capture c %}{% include image.html src="/content/Reverse Engineer/BF3/bf3_alley_blender_dof.jpg" href="/content/Reverse Engineer/BF3/bf3_alley_blender_dof.png" inline=1 style="width:100%; aspect-ratio: 16/9;" %}{% endcapture %} {% capture f %}Fully textured scene coming soon™{% endcapture %} {% include figure.html content=c footer=f %}
Render Analysis {% capture c %}{% include image.html src="/content/Reverse Engineer/BF3/alley_drawcalls.gif" inline=1 style="width:100%; aspect-ratio: 16/9;" %}{% endcapture %} {% capture f %} A wireframe is shown for each drawcall issued. BF3 makes heavy use of instancing, so most of the geometry is drawn in relatively few drawcalls (~300 here). Only unlit surface color is shown, but simultaneously other PBR data is being drawn (deferred rendering). {% endcapture %} {% include figure.html content=c footer=f %}To understand how the texturing was achieved, I wrote a Python script in Blender to convert shader assembly to a material node network.
Disclaimer: All reverse engineering I conduct is purely for educational purposes. I do not claim to be responsible for any of the original work.
{% capture c %}{% include image.html src="/content/Reverse Engineer/ArmA/utes.jpg" href="/content/Reverse Engineer/ArmA/utes_4k.jpg" inline=1 style="width:100%; aspect-ratio: 16/9;" %}{% endcapture %} {% capture f %}Work in progress port of ArmA 2's Utes map into Blender, by reverse engineering & extracting from the gamefiles (Enlarge for 4k).{% endcapture %} {% include figure.html content=c footer=f %}
I'm more of a programmer than an artist, but I dabble when I can.
AN-PRC-117G Radio + Display Shield
Fully procedurally modeled & textured using Blender, with some artistic liberties taken. {% include image.html src="/content/Art/an-prc-117g_small.jpg" href="/content/Art/an-prc-117g.png" style="width:100%; aspect-ratio: 16/9;" %}
World Machine Terrain
Fully procedurally modeled & textured using World Machine's erosion simulation. {% include image.html src="/content/Art/WM_small.jpg" href="/content/Art/WM.jpg" style="width:100%; aspect-ratio: 16/9;" %}
{% capture c %}{% include image.html src="/content/Art/earf3.png" href="/content/Art/earf3.png" inline=1 style="width:100%; aspect-ratio: 16/9;" %}{% endcapture %} {% capture f %}Earth (Realistic){% endcapture %} {% include figure.html content=c footer=f %}