astrochili / defold-illumination

Ready-to-use forward shading lighting extension for Defold
MIT License
40 stars 2 forks source link
3d defold forward-shading lighting

logo

Illumination

Release License Website Mastodon Twitter Telegram Buy me a coffee

📼 Also in this series:

Overview

This extension contains ready-to-use forward shading lighting for 3D games made with Defold. Just set the provided material to your mesh and place light sources on the scene.

Technically it supports about ~200 light sources, but the performance limit is about 20-30 sources at the moment. Need to implement clustered forward shading to get a valuable performance boost.

All the lighting data passed to the shader program as the texture, so it doesn't use a render script.

🎮 Play HTML5 demo with 🔦 on the E key.

💬 Discuss on the forum.

Features

Install

Add link to the zip-archive of the latest version of defold-illumination to your Defold project as dependency.

Quick Start

  1. Add illumination.go to your scene as the sunlight source and configure it.
  2. Add light_point.go or light_spot.go as light sources and configure them.
  3. Set /illumination/materials/model.material to your mesh.
  4. Set /illumination/textures/data.png to the DATA_TEXTURE slot.
  5. Fill LIGHT_TEXTURE, SPECULAR_TEXTURE and NORMAL_TEXTURE slots with your maps or set the empty texture /illumination/textures/empty.png.

Illumination

illumination

rotation

Affects the direction of sunlight.

ambient_color

Ambient light color.

ambient_level

Ambient light strength from 0.0 to 1.0.

sunlight_color

Directional light color.

sunlight_brightness

Directional light strength from 0.0 to 1.0.

sunlight_specular

Directional light specular component from 0.0 to 1.0.

fog

Adds fog in front of the camera and fade-out distant objects.

fog_is_radial

fog_distance_min

Distance at which the fog begins to appear.

fog_distance_max

Distance at which the fog reaches the full strength.

fog_color

Used to draw the fog gradient and sent with the clear_color message to the render script.

fog_level

Fog full strength from 0.0 to 1.0.

Light

light-point light-spot

There are light_point.go and light_spot.go. The only difference is the texture of the debug mesh for a friendlier placement on the scene.

position

Light source world position.

rotation

Rotation affects the direction of the spotlight when cutoff is less than 1.0.

color

Light color that will be multiplied with the diffuse color.

brightness

Light brightness from 0.0 to 1.0.

radius

Light radius.

specular

Light specular component from 0.0 to 1.0, will be multiplied with the specular map color.

smoothness

Light smoothness / attenuation from 0.0 to 1.0.

cutoff

Spotlight cutoff from 0.0 to 1.0.

To get the best results, you need to jungle with radius, cutoff and smoothness, which is not so obvious at the moment.

Material

material flashlight

Use the /illumination/materials/model.material material on your meshes to add them to lighting calculation.

It's important to fill unused texture slots with /illumination/textures/empty.png.

DIFFUSE_TEXTURE

A basic diffuse texture.

DATA_TEXTURE

The illumination data texture, always set to /illumination/textures/data.png.

LIGHT_TEXTURE

A baked light map or an emission map texture.

If your light map texture has different uv coordinates from the diffuse texture you need to turn on surface.y constant.

SPECULAR_TEXTURE

A specular map texture.

NORMAL_TEXTURE

A normal map texture with green on the top.

OpenGL normal maps format used by default. To use DirectX format turn on surface.z constant.

surface

Fragment constant to pass some surface properties.

Module

illumination.set_debug(is_enabled)

Enables the sun and light sources debug meshes.

illumination.set_debug(true)

illumination.is_debug()

Returns the debug mode state as boolean.

local is_debug = illumination.is_debug()

illumination.set_light(light, url)

Manually add or remove a light source. Don't use it if you already use light_point.go or light_spot.go.

-- Prepare the light
local light = {
    position = go.get_world_position(),
    direction = vmath.rotate(go.get_world_rotation(), vmath.vector3(0, 0, 1)),
    color = vmath.vector4(1.0),
    radius = 5.0,
    specular = 0.5,
    smoothness = 1.0,
    cutoff = 1.0,
}

-- Prepare the url
local light_url = msg.url('#')

-- Add or update the light
illumination.set_light(light, light_url)

-- Remove the light
illumination.set_light(nil, light_url)

TrenchBroom

TrenchFold extension contains entities illumination, light_point and light_spot to configure lighting directly on the map.

To assign textures to meshes use texture path patterns:

Credits