Luz de contorno

O ângulo entre a normal e a visão, elevado a uma potência. Três formas, três potências de contorno.

O editor acima está rodando este projeto. Mude uma linha e ele recarrega.

Classes do Godot usadas

MeshInstance3DShaderMaterialWorldEnvironment

O código

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;
}

Mais exemplos de Shaders