Make good-looking games without asset generators
You don't need an art tool to make a game that looks released. Most of what makes a game look good isn't the models or the sprites. It's the light, the colour, the sky, the water and the way things move. Your assistant can write all of that in code, in the same chat where it writes the game. There are no keys, no credits to buy and no files to upload, and the game stays small enough to load fast on a phone.
This guide covers the tricks that make the biggest difference, what to ask for, and a few short snippets if you want to see how they work. Everything here runs on the Compatibility renderer that arcadegnt uses for the web.
Why code-built art works
Put a plain grey box under a warm sunset, with soft fog behind it and a glowing edge, and it looks like a design choice. Put a detailed model under flat white light on an empty background and it looks like a prototype. Players notice four things first:
- Light. Where it comes from, what colour it is, and what glows.
- Colour. One small palette used everywhere.
- Depth. Fog, a sky, things in the distance, layers in 2D.
- Motion. Water that moves, things that bob, sparks on every hit.
All four come from code. Simple shapes lit well beat detailed shapes lit badly.
1. Pick a look and a palette first
Before any code, give the game a style in one sentence and four or five colours. "Low-poly island at golden hour, warm oranges and teal water." "Neon racer at night, magenta and cyan on near-black." "Storybook forest, soft greens with cream highlights."
Low poly, neon, toy-like, papercraft and silhouette styles all suit code-built art. Photoreal does not. Name the style in your first prompt and your assistant can keep every material, light and particle to the same palette.
2. Light the scene before you add detail
In a 3D game, lighting does more than anything else. Ask for:
- A
WorldEnvironmentwith filmic tonemapping (ACES or AgX), glow turned on, a little fog and a sky. - One sun (a
DirectionalLight3D) with shadows, set low so shadows run long. A low warm sun reads as golden hour, a high white one as midday. - A few coloured accent lights: a warm lamp by a door, a cool rim light behind the hero.
- Emission for anything that should glow. Windows, neon trim, engine flames, pickups. With glow on, emissive parts bloom without any extra work.
var env := Environment.new()
env.background_mode = Environment.BG_SKY
env.sky = Sky.new()
env.sky.sky_material = ProceduralSkyMaterial.new()
env.tonemap_mode = Environment.TONE_MAPPER_ACES
env.glow_enabled = true
env.fog_enabled = true
env.fog_light_color = Color("f2b880")
env.fog_density = 0.01
Fog is the cheapest depth you will ever get: distant things fade into the sky colour and the world looks bigger than it is. Match the fog colour to the horizon.
If you see bold diagonal stripes across lit walls, that's shadow acne. Ask your assistant to raise the light's shadow_bias and shadow_normal_bias. The build guide has the numbers.
3. Procedural textures instead of flat colours
A flat colour is what makes a code-built model look like a placeholder. Godot can make textures from noise while the game loads, and they cost nothing to download.
- Noise textures. A
NoiseTexture2Dwith aFastNoiseLiteand a colour ramp gives you grass, dirt, rock, sand, rust or clouds, depending on the colours and the scale. - Bumps. A second noise texture with
as_normal_mapon makes the surface catch the light, which sells a rock or a stone wall far more than colour alone. - Patterns. An
Imagefilled pixel by pixel makes bricks, planks, tiles, stripes and speckle. - Triplanar mapping. Turn on
uv1_triplanarand the texture wraps any shape without stretching, so the assistant never has to unwrap a mesh. - Vary the surface. Different
roughnessandmetallicon each part: matte rock, glossy paint, shiny metal, a wet look near water.
var noise := FastNoiseLite.new()
noise.frequency = 0.03
var ramp := Gradient.new()
ramp.set_color(0, Color("4a3b2a"))
ramp.set_color(1, Color("9c8463"))
var tex := NoiseTexture2D.new()
tex.noise = noise
tex.seamless = true
tex.color_ramp = ramp
var mat := StandardMaterial3D.new()
mat.albedo_texture = tex
mat.uv1_triplanar = true
mat.roughness = 0.9
Change the two colours and the frequency and the same ten lines give you sand, moss, lava rock or snow.
4. Water that looks like water
Water is where code-built games most often look cheap, and where a small shader makes the biggest jump. Good game water is almost never one effect. It's several cheap ones stacked together.
3D water
Ask for a water shader with these layers:
- Waves in the vertex shader. Move the surface up and down with a few overlapping sine waves. Use a
PlaneMeshwith enough subdivisions to bend. - Two scrolling normal maps. The same noise texture scrolled in two directions at two scales. The ripples never repeat, and the sun glints off them.
- Fresnel colour. Deep colour when you look straight down, bright sky colour at a low angle. This one line is what makes it read as water and not blue plastic.
- Low roughness so the sun leaves a sharp highlight.
- A little transparency so the shore shows through the shallows.
shader_type spatial;
uniform vec4 deep : source_color = vec4(0.02, 0.18, 0.28, 1.0);
uniform vec4 sky : source_color = vec4(0.55, 0.8, 0.9, 1.0);
uniform sampler2D ripples : hint_normal, repeat_enable;
void vertex() {
VERTEX.y += sin(VERTEX.x * 0.5 + TIME) * 0.12 + sin(VERTEX.z * 0.35 + TIME * 1.4) * 0.08;
}
void fragment() {
vec2 uv = UV * 6.0;
vec3 a = texture(ripples, uv + TIME * vec2(0.03, 0.01)).rgb;
vec3 b = texture(ripples, uv * 1.6 - TIME * vec2(0.02, 0.035)).rgb;
NORMAL_MAP = mix(a, b, 0.5);
float fresnel = pow(1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0), 3.0);
ALBEDO = mix(deep.rgb, sky.rgb, fresnel);
ROUGHNESS = 0.05;
ALPHA = 0.85;
}
Then add the cheap extras that sell it:
- Foam. White particles or small noise-textured rings where the water meets rocks, boats and the shore.
- Caustics. A noise texture scrolling slowly across the sea floor and the bottom of walls, in an additive blend. That rippling light pattern does as much as the water itself.
- Splashes and wakes. A burst of particles when something lands, a short trail of foam behind a boat.
- A bob. Anything floating rises and tilts gently with the waves.
2D water
In 2D, the same ideas get simpler:
- Wobble. A small shader that shifts the picture by a scrolling noise texture makes anything under the surface ripple.
- Reflection. A flipped, tinted, slightly transparent copy of the scene above the waterline, with the same wobble.
- Highlights. A few thin light lines that drift sideways, and a lighter band right at the surface.
shader_type canvas_item;
uniform sampler2D noise : repeat_enable;
void fragment() {
vec2 wobble = (texture(noise, UV * 2.0 + TIME * 0.05).rg - 0.5) * 0.02;
COLOR = texture(TEXTURE, UV + wobble) * vec4(0.6, 0.85, 1.0, 1.0);
}
5. Skies and backgrounds
An empty background is the clearest prototype giveaway. Fill it.
- 3D skies.
ProceduralSkyMaterialgives you a sky with a sun disc for free. Tune the top, horizon and ground colours to the palette. For space and night, a sky shader can layer noise into nebulae and scatter stars. - 2D backdrops. Stack layers: a vertical gradient, far hills as dark silhouettes, nearer hills a step lighter, then the play layer, then foreground leaves or dust. Move each layer at a different speed (parallax) and a flat level gains real depth.
- Things that move in the distance. Drifting clouds, birds, slow-turning windmills, a blinking radio tower. A few of these make the world feel alive.
6. Models from shapes
Your assistant can model convincingly in code from boxes, spheres, cylinders, prisms and tori. The trick is many parts, each with its own material:
- A ship is a tapered hull, swept wings, a glass canopy, fins and two glowing thrusters, not one stretched box.
- A tree is a slightly bent trunk and three or four overlapping blobs of leaves in two shades of green.
- A rock is a sphere with its corners nudged at random, so no two look the same.
- A character is a body, head, arms and legs as separate pieces, so they can swing into a walk cycle.
Low poly with good materials is a style in its own right. Bevel the edges with a slightly smaller copy of the shape in a lighter colour, add an emissive strip, and a plain box becomes a sci-fi crate.
7. Motion and feedback
A still screenshot can look great while the game still feels flat. These are cheap and make a big difference:
- Idle motion. Pickups spin and bob, flags wave, grass sways (a small vertex shader), lights flicker.
- Particles on every event. Dust when landing, sparks on hits, a puff when an enemy goes, a shower of coins on a pickup.
CPUParticles2DandCPUParticles3Dare the safe choice on the web. - Juice. Screen shake on big hits, a frame or two of hit-stop, a white flash on whatever got hit, squash and stretch on jumps.
- Animated UI. The score ticks up instead of jumping, buttons bounce, the title fades in over the scene.
8. Sound, also from code
Sound is half of how a game feels. Your assistant can make it from scratch: short square and noise waves with a fade for jumps, coins and explosions, and a looping music track built from a chord progression, a bass line and drums. It won't sound like a studio soundtrack, but it fits a game with a code-built look far better than silence.
Faking what the web can't do
The web renderer leaves out some high-end effects. Each one has a classic fake:
| Effect | The fake |
|---|---|
| Bloom on bright things | Emission plus glow in the WorldEnvironment |
| Ambient occlusion in corners | Darker colours or a dark gradient where surfaces meet |
| Volumetric fog and light shafts | Regular fog, plus a few soft additive cones or planes |
| Real reflections | Fresnel colour plus a sharp sun highlight |
| Global illumination | A coloured ambient light and coloured accent lights that bounce the scene's colours |
Your first game with code-built art
Paste a prompt like this one:
Make a 3D boat game with arcadegnt, with no asset generators: build all the art in
code. Low-poly islands at golden hour, warm oranges and teal water. Light the scene
first: a low warm sun with shadows, ACES tonemapping, glow and soft fog. Give every
surface a procedural noise texture. Write a water shader with vertex waves, two
scrolling normal maps, fresnel colour and foam around the islands and behind the boat.
Add a title screen and sounds made in code. Build it and check it on desktop and phone.
Your assistant will:
- Write the scene, the materials and the shaders in GDScript.
- Build the game, fixing any errors arcadegnt reports with file and line.
- Play it with
check_gameon a desktop and a phone, look at the screenshots, and fix what looks flat or wrong.
You get a link like https://golden-harbor.arcadegnt-play.com/ that anyone can open on a computer or phone.
Tips for better results
- Ask for the lighting by name. "ACES tonemapping, glow, fog, a low warm sun" gets much better results than "make it look nice".
- Judge the screenshots. Ask your assistant to look at each
check_gameshot as a player scrolling the gallery would, and to fix anything that reads as a prototype: flat colours, an empty sky, no light, nothing moving. - Fix one thing at a time. "The water looks like plastic: add fresnel and a sharper sun highlight" works better than "make the water better".
- Keep one palette. If a new effect clashes, ask for it in the game's colours.
- Mix in free packs. Code-built art pairs well with CC0 assets. Your assistant can import a Kenney font or a Poly Haven sky with
import_assetand build the rest in code.
When to reach for an asset generator
Code-built art is great for environments, water, skies, effects, props and stylised vehicles. A few things are hard to get from shapes in code, and that's when a generator helps:
- Characters with faces and detailed outfits. Read Meshy MCP with arcadegnt for 3D.
- Animated pixel-art sprites. Read PixelLab MCP with arcadegnt.
- Large hand-built levels. Read Blender MCP with arcadegnt.
When the game is ready, ask your assistant to submit it to the arcadegnt gallery so other people can play it.