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.
Geometry
# Name Symptom Cause Solutions
Your browser cannot play this video. Download video .
Aliased lines Thin geo like cables or fences jitters, disappears Geometry is thinner than a single pixel Make LODs with thicker geo, different texture Blend to a solid texture at far distance Use a different anti-aliasing algorithm Flipped normals Mesh is inverted or partially invisible Back faces of triangles are hidden by default (backface culling) Flip (reverse) vertex normals to face outside If both sides needed, enabled two-sided rendering in material Import scale Model is huge or tiny after importing Different editors use 1 cm or 1 m as base unit Make sure to follow correct physical dimensions when modelling Set import or export scale to 0.01 or 100x
Your browser cannot play this video. Download video .
Temporal anti-aliasing Ghosting. Meshes leave blurry trail when moving Temporal smoothing algorithms combine multiple frames over time for high quality Make sure game keeps good, stable framerate, high resolution If using vertex displacement in shader, add motion vectors support For stability but lower quality, switch to FXAA anti-aliasing
Your browser cannot play this video. Download video .
Z-Fighting Flickering polygons Multiple polys have equal Z-depth in the same pixel Make sure no polygons overlap on the same plane Increase near clip distance in camera Split edges Holes appear in animated mesh Vertices have two modes: shared or split Merge vertices in your 3d software Lock vertex normals instead of physically splitting edges Use auto smooth groups
Your browser cannot play this video. Download video .
Visibility culling Mesh or particle system disappearing from certain positions Frustum or occlusion culling hides objects by their bounding boxes Check if occluders (geometry) are correct Increase bounding box size
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
Your browser cannot play this video. Download video .
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
# Name Symptom Cause Solutions Bad sorting of polygons Triangles of meshes or particles appear in wrong order Game engines employ per-object sorting instead of per-triangle, for speed Split big objects into smaller ones Move pivot closer to center of mesh Use dithered opacity or cutout alpha for semi-solid objects Hack: change draw priority (render queue) of shader Depth of field vs. transparents Transparent objects are not affected by depth of field DoF reads the depth of the scene to perform blur. Translucent materials don’t write single depth Use cutout alpha (masked opacity) instead In Unreal, enable Separate Translucency in material Sometimes you can’t avoid it
Lighting
# Name Symptom Cause Solutions Lightmap bleeding Dark or wrong mesh edges Bilinear filtering picks up information from neighboring texels Increase margins between UV islands Increase mesh’s lightmap resolution Shadow acne Stepped shadows at certain angles Shadow map’s resolution is not enough to represent the continuous surface Play with shadow bias parameter in light’s settings Increase shadow map resolution Missing reflection probes Black reflections on metals Lack of reflection sources Make sure at least 1 reflection probe covers every area in the scene Movable SkyLight (UE4)Black reflections on metals SkyLight or all reflection probes have Mobility set to Movable Change their Mobility to Static Overlapping polygons Black spots in lightmaps Multiple triangles are baked to the same texel Make sure no UV islands overlap Remove any overlapping geo in mesh & level Check for duplicate objects in level Dynamic lights limit Flickering lights Renderer reached a limit of light sources affecting the same pixel Reduce # of lights overlapping in that place (change radius, move, delete) Use static (baked) lights instead
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)
Node Graph Equivalents
# Equivalent nodes across different software. Useful when translating tutorials or porting effects.
Functions
# UE BP UE mat Unity shader Blender mat Designer Houdini VOP Hou VEX HLSL FInterp Lerp Lerp Mix Blend Mix lerplerpLocation Position Position Location Position Position v@PSV_PositionBranch😑 If💚 Branch😑 Mix🤷♂️ If…Else If💚 ififSwitch/Select Switch none none Switch Switch switchswitchLiteral Float Constant Float Value Float Constant floatconst floatBreak Vector Component Mask (or Convert) Split Separate XYZ RGB-A Split Vector to Float .x.xMake Vector Append (or Convert) Combine Combine XYZ RGB-A Merge Float to Vector setfloat3Transform Vector Transform 3x3 Matrix Transform none none Transform Matrix mulmulMap Range Remap Remap Map Range Levels Fit fit(x-vMin)/(vMax-vMin)Dot Product Dot Dot Product Vector Math none? Dot Product dotdotnone One Minus One Minus Invert Invert Complement 1-x1-xGet Linear Color Value Curve Atlas Row Parameter Sample Gradient Color Ramp Gradient Map Ramp Parameter chrampn/a Sample Texture 2D At UV Positions* Texture Sample Sample Texture 2D Image Texture Bitmap Texture texturetexture2d
* With the Geometry Script plugin
Concepts
# UE BP UE mats Blender mats Designer Hou Rect Light n/a Area Light Plane Light Area/Grid Light Outliner none Outliner Explorer Tree View Reroute Reroute Reroute Dot Node Dot Node Local Variable Named Reroute none Portal none
Shortcuts
# Action UE BP UE mats Blender mats Designer Hou Graph: Add Tab/RMB Tab/RMB Shift+A Tab/Spacebar Tab/RMB Graph: Disconnect Alt+LMB Alt+LMB Drag away Alt+LMB Drag→click Graph: Pan view RMB-drag RMB-drag MMB-drag MMB-drag MMB-drag
Credits, contributing
# 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 .
If you want something added or fixed, just add a new issue on GitHub. I welcome pull requests too! (though quality is expected)
License
# Feel free to share, copy, print and modify the document, under the terms of Apache License 2.0 .