Most common glitches in game art and how to solve them
Troubleshooting tips for mesh issues, lighting bugs, particles, transparency, physics. The solutions can be applied in Unity, Unreal Engine, Godot and most other game engines.
Find more game dev tutorials at TechArtAid.com
Content Troubleshooting
Geometry
Materials
Name | Symptom | Cause | Solutions |
---|---|---|---|
Bilinear mipmap filtering |
Blurry textures at oblique angles | Bilinear filtering in perspective projection underestimates required mipmap level of a texture | – Use anisotropic texture filtering, if performance tradeoff is acceptable |
sRGB vs linear |
Textures are too dark or washed out after import, or roughness is wrong | Textures come in (at least) two formats: linear color or sRGB. Linear is used for data, while sRGB for human-readable color | – In texturing programs, export albedo/diffuse as sRGB – In game engine, enable sRGB in albedo/diffuse textures– Disable sRGB (use linear) for data (roughness, masks) |
Normal Y-axis sign |
Normal map looks inverted | Some engines expect Y+ axis to mean “down”, while others consider it “up” | – Invert green channel of normal map -In Unreal, tick Flip Green Channel in texture |
Aliasing |
Moire patterns, bloom flickering | Resolution is not dense enough to represent (aka sample) the content | – Use smoother patterns in textures – Add soft radius to light sources – Blend to smoother texture by distance – Use different anti-aliasing algorithm |
Alpha bleeding |
White edges in textures with transparency | Alpha compositing | – In Substance Painter, use Dilation mode when exporting-In Photoshop, fill the background by selecting alpha mask, inverting selection and use Fill > Content Aware – Respect premultiplied alpha in shaders |
Hard normals on foliage |
Flat shading on foliage models, harshly disconnected from terrain | Foliage mesh, made of big flat planes, is interpreted too literally by lighting | – Use manually edited, up-pointing vertex normals – Read normal from terrain |
Negative or NaN color |
Black or deeply saturated squares on screen | Pixel’s color value is negative or not a number. This corrupts some algorithms (bloom) | – Check for division-by-zero in shaders – Clamp values to [0,1] in shaders |
Edge bleeding | Colors from another island of UV space bleeding into the borders of given one | Bilinear texture filtering picks up information from neighboring texels, as it’s unaware of UV seams or image atlas items | – Increase margins between UV islands – Add 1 pixel of space between items in tileset/atlas – In Substance Painter, use Dilation mode when exporting |
Banding in display |
Stepped gradients on screen | Transition between certain colors can’t be represented, due to display’s color precision | – Add some film grain – Use dithering – Check if your post-process stack has HDR until very end |
Banding in textures |
Stepped gradients in textures | Lossy compression can’t represent subtle gradient | – Use more contrast in your source textures (e.g. stronger normal map), then reduce it in shader |
Half precision | Pixelated procedural materials on mobile | Mobile devices optimize some values by storing them in 16 bits instead of 32 | – Make your effects less dependent on precision (smooth flow maps, bigger features on texture) – Use modulo (%, fmod) on final time and UVs – Force full precision on variable |
Transparency
Lighting
Animation
Name | Symptom | Cause | Solutions |
---|---|---|---|
Root motion | Character “swims” or drifts far from pivot over time | Root bone transform in animation is updated to match character movement in game | – Fix the loop, making sure it ends where it started – Disable root motion |
Physics
Name | Symptom | Cause | Solutions |
---|---|---|---|
Tick rate | Fast objects fly through, skipping collision | Physics frame rate was not sufficient for the system to detect collision | – Use thicker collider – Enable continuous collision detection (CCD) |
Contributing
If you want something added or fixed, just add a new issue on GitHub.
I welcome pull requests too! (though quality is expected)
Credits
Oskar Świerad of Tech Art Aid is the original author and current maintainer.
Huge thanks to contibutors of examples from the Unity, Unreal Reddit threads and Twitter.
License
Feel free to share, copy, print and modify the document, under the terms of Apache License 2.0.