Luz de contorno
Um brilho ao longo da silhueta que acompanha a câmera.
- 01ObjetivoLuz
- 02TécnicaFresnel
- 03ExecuçãoLuz de contorno
Parâmetros
Copie para a sua plataforma
- GLSLCopiar
- GodotCopiar
Cadeia de nós
Montada passo a passo, no estilo do GLSL, com os nomes de nós dele.
Montada passo a passo, no estilo do Godot, com os nomes de nós dele.
Este card ainda não tem versão para Unreal Engine 5, então os nós mostram os nomes do GLSL.
Este card ainda não tem versão para Unity, então os nós mostram os nomes do GLSL.
Este card ainda não tem versão para Blender, então os nós mostram os nomes do GLSL.
dotDotProductdotdotdot NormalVisão01 Quanto está de frente
1.0 - xOneMinus1.0 - x1.0 - x1.0 - x Entrada02 Inverter
powPowpowpowpow Entrada03 Estreitar a faixa
*Multiply*** Entrada04 Colorir
Como funciona
Texto provisório do esqueleto. Israel o substitui.
O produto escalarMultiplica dois vetores componente a componente e soma os resultados. Para vetores unitários é o cosseno do ângulo entre eles, de 1 (mesma direção) a -1 (opostos). Produto escalar Multiplica dois vetores componente a componente e soma os resultados. Para vetores unitários é o cosseno do ângulo entre eles, de 1 (mesma direção) a -1 (opostos). Normal Um vetor unitário perpendicular a uma superfície, apontando para onde ela está virada. Iluminação e efeitos Fresnel o comparam com outras direções.dot(a, b) = |a| |b| cos θ
Monte no GLSL
Texto provisório do esqueleto. Israel o substitui.
Cole a função num shader de fragmento que receba a normal em espaço de mundo e a direção da câmera.
Monte no Godot
O VisualShader também tem um nó Fresnel nativo que faz os três primeiros passos.
Texto provisório do esqueleto. Israel o substitui.
Cole o shader num novo ShaderMaterial de um MeshInstance3D. Ele é unshaded e escreve o contorno em ALBEDO, então a malha mostra só a cor do contorno, sem iluminação.
Ainda não há tutorial de Unreal Engine 5 para este card.
Ainda não há tutorial de Unity para este card.
Ainda não há tutorial de Blender para este card.
Código
#version 300 es// Fresnel → Rim light, web GLSL (GLSL ES 3.00). From Creative Center, MIT license.precision highp float;uniform float u_time;uniform float p_power; // Power: 3.0 (0.5 to 8.0)uniform vec3 p_color; // Color: vec3(0.35, 0.75, 1.0)uniform float p_intensity; // Intensity: 1.5 (0.0 to 4.0)in vec2 v_uv;in vec3 v_position;in vec3 v_normal;in vec3 v_view;out vec4 fragColor;struct Inputs { vec2 uv; vec3 position; vec3 normal; vec3 view; float time;};// i.view points from the surface toward the camera, so dot(normal, view) is 1 where the surface faces the camera// and 0 at the silhouette. max() drops back faces, which would otherwise go above 1 after the inversion.vec4 effect(Inputs i) { float facing = max(dot(i.normal, i.view), 0.0); float edge = 1.0 - facing; float rim = pow(edge, p_power); vec3 glow = rim * p_color * p_intensity; return vec4(glow, 1.0);}void main() { Inputs i; i.uv = v_uv; i.position = v_position; // Interpolation shortens the vectors between vertices i.normal = normalize(v_normal); i.view = normalize(v_view); i.time = u_time; fragColor = effect(i);}// Fresnel → Rim light, Godot 4. From Creative Center, MIT license.shader_type spatial;// Unshaded shows the effect's color as is, like the site's preview; scene lights don't touch itrender_mode unshaded;uniform float power : hint_range(0.5, 8.0, 0.1) = 3.0;uniform vec3 color : source_color = vec3(0.35, 0.75, 1.0);uniform float intensity : hint_range(0.0, 4.0, 0.05) = 1.5;struct Inputs { vec2 uv; vec3 position; vec3 normal; vec3 view; float time;};// i.view points from the surface toward the camera, so dot(normal, view) is 1 where the surface faces the camera// and 0 at the silhouette. max() drops back faces, which would otherwise go above 1 after the inversion.vec4 effect(Inputs i) { float facing = max(dot(i.normal, i.view), 0.0); float edge = 1.0 - facing; float rim = pow(edge, power); vec3 glow = rim * color * intensity; return vec4(glow, 1.0);}void fragment() { Inputs i; // Godot's UV starts at the top-left; the effect expects GLSL's bottom-left i.uv = vec2(UV.x, 1.0 - UV.y); // VERTEX, NORMAL and VIEW are in view space here; the effect works in world space i.position = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz; i.normal = normalize((INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz); i.view = normalize((INV_VIEW_MATRIX * vec4(VIEW, 0.0)).xyz); i.time = TIME; ALBEDO = effect(i).rgb; // For a see-through effect, also write ALPHA = effect(i).a; (Godot then sorts it as transparent)}Ainda não há código de Unreal Engine 5 para este card.
Ainda não há código de Unity para este card.
Ainda não há código de Blender para este card.
Leitura complementar
- PBR: Theory (abre em uma nova aba)Artigo
- Schlick's approximation (abre em uma nova aba)Referência
- dot (abre em uma nova aba)Referência
- pow (abre em uma nova aba)Referência