Lumière de bord
L'angle entre la normale et la vue, élevé à une puissance. Trois formes, trois puissances de bord.
L'éditeur ci-dessus fait tourner ce projet. Changez une ligne et il se recharge.
Classes Godot utilisées
MeshInstance3DShaderMaterialWorldEnvironment
Le code
scripts/main.gd
extends Node
const COLORS: Array = [Color(0.0, 0.7, 1.0), Color(0.55, 0.94, 0.6), Color(0.98, 0.5, 0.5)]
var shapes: Node3D
func _ready() -> void:
_add_environment()
_add_light()
shapes = Node3D.new()
add_child(shapes)
var meshes: Array[Mesh] = [SphereMesh.new(), TorusMesh.new(), BoxMesh.new()]
for i in meshes.size():
var material: ShaderMaterial = ShaderMaterial.new()
material.shader = Get.shader('rim')
material.set_shader_parameter('rim_color', COLORS[i])
material.set_shader_parameter('rim_power', 1.5 + i * 1.5)
var item: MeshInstance3D = MeshInstance3D.new()
item.mesh = meshes[i]
item.material_override = material
item.position = Vector3((i - 1) * 2.6, 0, 0)
shapes.add_child(item)
var camera: Camera3D = Camera3D.new()
camera.position = Vector3(0, 1.2, 6)
add_child(camera)
camera.look_at(Vector3.ZERO, Vector3.UP)
camera.current = true
print('rim power 1.5, 3.0 and 4.5, left to right')
func _process(delta: float) -> void:
for shape in shapes.get_children():
shape.rotate_y(delta * 0.5)
func _add_environment() -> void:
var env: Environment = Environment.new()
env.background_mode = Environment.BG_COLOR
env.background_color = Color(0.03, 0.03, 0.05)
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
env.ambient_light_color = Color(0.1, 0.11, 0.16)
env.ambient_light_energy = 1.0
env.glow_enabled = true
var world: WorldEnvironment = WorldEnvironment.new()
world.environment = env
add_child(world)
func _add_light() -> void:
var light: DirectionalLight3D = DirectionalLight3D.new()
light.rotation_degrees = Vector3(-40, -30, 0)
light.light_energy = 0.6
add_child(light)shaders/rim.gdshader
shader_type spatial;
uniform vec3 base_color: source_color = vec3(0.06, 0.07, 0.12);
uniform vec3 rim_color: source_color = vec3(0.0, 0.7, 1.0);
uniform float rim_power = 3.0;
uniform float rim_strength = 2.5;
void fragment() {
float rim = 1.0 - clamp(dot(normalize(NORMAL), normalize(VIEW)), 0.0, 1.0);
ALBEDO = base_color;
ROUGHNESS = 0.6;
METALLIC = 0.2;
EMISSION = rim_color * pow(rim, rim_power) * rim_strength;
}