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

86 lines
2.5 KiB
Plaintext

shader_type spatial;
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"
uniform vec4 albedo_color : source_color;
uniform sampler2D albedo_texture : source_color;
uniform sampler2D normal_texture : source_color;
uniform bool use_normalmap = false;
uniform bool uncompressNormalMap = true;
uniform bool use_alpha_texture = false;
uniform bool useCustomNormals = true;
uniform float alpha_scissor_threshold : hint_range(0,1);
uniform float normal_scale : hint_range(-5,5) = 1;
uniform vec3 uv1_scale = vec3( 1, 1, 1 );
uniform vec3 uv1_offset;
varying vec3 vertexNormal;
varying vec3 vertexTangent;
varying vec3 vertexBinormal;
uniform float binormalMix:hint_range(0,1);
void vertex()
{
UV = UV * uv1_scale.xy + uv1_offset.xy;
vertexNormal = localToViewDirection( NORMAL, MODELVIEW_NORMAL_MATRIX );
vertexTangent = localToViewDirection( TANGENT, MODELVIEW_NORMAL_MATRIX );
vertexBinormal = cross( vertexNormal, vertexTangent );
//NORMAL = localToViewDirection( NORMAL, MODELVIEW_NORMAL_MATRIX );
}
void fragment()
{
vec2 base_uv = UV;
vec4 albedo = texture( albedo_texture, base_uv ) * albedo_color;
vec4 normal_tex = texture( normal_texture, base_uv );
vec3 RENDER_NORMAL = useCustomNormals ? vertexNormal : NORMAL;
if ( ! useCustomNormals && ! FRONT_FACING )
{
RENDER_NORMAL = - RENDER_NORMAL;
}
//ALBEDO = mix( vertexNormal, NORMAL, normalMix );
// 0.5 + -1.0 == -1.0 + 0.5
//ALBEDO = vec3(1.0 - NORMAL.y, 1.0 - NORMAL.x, - NORMAL.z)* 0.5;
if ( use_normalmap )
{
vec3 normalmap;
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;
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;
if ( use_alpha_texture )
{
ALPHA = albedo.a;
ALPHA_SCISSOR_THRESHOLD = alpha_scissor_threshold;
}
}