rj-action-library/External/Imposter/materials/normal_baker.gdshader

86 lines
2.5 KiB
Plaintext
Raw Normal View History

2024-12-01 17:07:41 +00:00
shader_type spatial;
2025-05-07 12:18:01 +00:00
render_mode blend_mix,depth_draw_opaque,cull_disabled, unshaded;
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Colors.gdshaderinc"
2025-01-03 12:09:23 +00:00
uniform vec4 albedo_color : source_color;
uniform sampler2D albedo_texture : source_color;
2024-12-01 17:07:41 +00:00
uniform sampler2D normal_texture : source_color;
uniform bool use_normalmap = false;
2025-05-07 12:18:01 +00:00
uniform bool uncompressNormalMap = true;
2024-12-01 17:07:41 +00:00
uniform bool use_alpha_texture = false;
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
uniform bool useCustomNormals = true;
2024-12-01 17:07:41 +00:00
uniform float alpha_scissor_threshold : hint_range(0,1);
2025-05-07 12:18:01 +00:00
uniform float normal_scale : hint_range(-5,5) = 1;
2024-12-01 17:07:41 +00:00
2025-05-07 12:18:01 +00:00
uniform vec3 uv1_scale = vec3( 1, 1, 1 );
2024-12-01 17:07:41 +00:00
uniform vec3 uv1_offset;
2025-05-07 12:18:01 +00:00
varying vec3 vertexNormal;
varying vec3 vertexTangent;
varying vec3 vertexBinormal;
uniform float binormalMix:hint_range(0,1);
2024-12-01 17:07:41 +00:00
2025-01-03 12:09:23 +00:00
void vertex()
{
UV = UV * uv1_scale.xy + uv1_offset.xy;
2025-05-07 12:18:01 +00:00
vertexNormal = localToViewDirection( NORMAL, MODELVIEW_NORMAL_MATRIX );
vertexTangent = localToViewDirection( TANGENT, MODELVIEW_NORMAL_MATRIX );
vertexBinormal = cross( vertexNormal, vertexTangent );
//NORMAL = localToViewDirection( NORMAL, MODELVIEW_NORMAL_MATRIX );
2024-12-01 17:07:41 +00:00
}
2025-01-03 12:09:23 +00:00
void fragment()
{
2024-12-01 17:07:41 +00:00
vec2 base_uv = UV;
2025-01-03 12:09:23 +00:00
vec4 albedo = texture( albedo_texture, base_uv ) * albedo_color;
vec4 normal_tex = texture( normal_texture, base_uv );
2025-05-07 12:18:01 +00:00
vec3 RENDER_NORMAL = useCustomNormals ? vertexNormal : NORMAL;
if ( ! useCustomNormals && ! FRONT_FACING )
{
RENDER_NORMAL = - RENDER_NORMAL;
}
//ALBEDO = mix( vertexNormal, NORMAL, normalMix );
2024-12-01 17:07:41 +00:00
// 0.5 + -1.0 == -1.0 + 0.5
//ALBEDO = vec3(1.0 - NORMAL.y, 1.0 - NORMAL.x, - NORMAL.z)* 0.5;
2025-01-03 12:09:23 +00:00
if ( use_normalmap )
2024-12-01 17:07:41 +00:00
{
vec3 normalmap;
2025-05-07 12:18:01 +00:00
if ( uncompressNormalMap )
{
normalmap.xy = normal_tex.xy * 2.0 - 1.0;
normalmap.z = sqrt( max( 0.0, 1.0 - dot( normalmap.xy, normalmap.xy ) ) );
}
else
{
normalmap = normal_tex.xyz * 2.0 - 1.0;
}
vec3 textureNormal = vertexTangent * normalmap.x +
vertexBinormal * normalmap.y +
vertexNormal * normalmap.z;
2025-01-03 12:09:23 +00:00
2025-05-07 12:18:01 +00:00
RENDER_NORMAL = normalize( mix( RENDER_NORMAL, textureNormal, normal_scale ) );
//NORMAL = textureNormal;
}
vec3 rn = vec3( RENDER_NORMAL.x, RENDER_NORMAL.y, RENDER_NORMAL.z ) * 0.5 + 0.5;
ALBEDO = rn;
2025-01-03 12:09:23 +00:00
if ( use_alpha_texture )
2024-12-01 17:07:41 +00:00
{
2025-01-03 12:09:23 +00:00
ALPHA = albedo.a;
2024-12-01 17:07:41 +00:00
ALPHA_SCISSOR_THRESHOLD = alpha_scissor_threshold;
}
}