109 lines
4.1 KiB
Plaintext
109 lines
4.1 KiB
Plaintext
![]() |
|
||
|
shader_type spatial;
|
||
|
render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx;
|
||
|
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Normals.gdshaderinc"
|
||
|
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
|
||
|
|
||
|
|
||
|
uniform vec4 albedo : source_color;
|
||
|
uniform sampler2D texture_albedo : source_color, filter_linear_mipmap_anisotropic, repeat_enable;
|
||
|
uniform ivec2 albedo_texture_size;
|
||
|
uniform float point_size : hint_range(0.1, 128.0, 0.1);
|
||
|
|
||
|
uniform float roughness : hint_range(0.0, 1.0);
|
||
|
uniform sampler2D texture_metallic : hint_default_white, filter_linear_mipmap_anisotropic, repeat_enable;
|
||
|
uniform vec4 metallic_texture_channel;
|
||
|
uniform sampler2D texture_roughness : hint_roughness_r, filter_linear_mipmap_anisotropic, repeat_enable;
|
||
|
|
||
|
uniform float specular : hint_range(0.0, 1.0, 0.01);
|
||
|
uniform float metallic : hint_range(0.0, 1.0, 0.01);
|
||
|
|
||
|
uniform sampler2D texture_normal : hint_roughness_normal, filter_linear_mipmap_anisotropic, repeat_enable;
|
||
|
uniform float normal_scale : hint_range(-16.0, 16.0);
|
||
|
varying vec3 uv1_triplanar_pos;
|
||
|
|
||
|
uniform float uv1_blend_sharpness : hint_range(0.0, 150.0, 0.001);
|
||
|
varying vec3 uv1_power_normal;
|
||
|
|
||
|
uniform vec3 uv1_scale;
|
||
|
uniform vec3 uv1_offset;
|
||
|
uniform vec3 uv2_scale;
|
||
|
uniform vec3 uv2_offset;
|
||
|
|
||
|
uniform vec2 mapSize = vec2(1024,1024);
|
||
|
uniform vec2 mapCenter = vec2(0,0);
|
||
|
uniform sampler2D heightMap;
|
||
|
uniform float minHeight = 0;
|
||
|
uniform float maxHeight = 0;
|
||
|
|
||
|
uniform float normalTexelSize = 0.1;
|
||
|
uniform float normalHeightSize = 1;
|
||
|
varying vec2 heightUV;
|
||
|
|
||
|
uniform float snapDistance: hint_range(5.0, 100.0) = 25;
|
||
|
|
||
|
void vertex()
|
||
|
{
|
||
|
vec3 quantizedCam = snapRounded( CAMERA_POSITION_WORLD, snapDistance );
|
||
|
quantizedCam.y = 0.0;
|
||
|
VERTEX += quantizedCam;
|
||
|
vec3 position3D = localToWorld( VERTEX, MODEL_MATRIX );
|
||
|
|
||
|
vec2 mapOffset = mapCenter - mapSize/2.0;
|
||
|
vec2 uv = ( vec2( position3D.x, position3D.z ) - mapOffset ) / mapSize;
|
||
|
heightUV = uv;
|
||
|
float sampledHeight = textureLod( heightMap, uv, 0 ).r;
|
||
|
position3D.y += mix( minHeight, maxHeight, sampledHeight );
|
||
|
|
||
|
VERTEX = worldToLocal( position3D, MODEL_MATRIX );
|
||
|
|
||
|
vec3 normal = MODEL_NORMAL_MATRIX * NORMAL;
|
||
|
|
||
|
TANGENT = vec3(0.0, 0.0, -1.0) * abs(normal.x);
|
||
|
TANGENT += vec3(1.0, 0.0, 0.0) * abs(normal.y);
|
||
|
TANGENT += vec3(1.0, 0.0, 0.0) * abs(normal.z);
|
||
|
TANGENT = inverse(MODEL_NORMAL_MATRIX) * normalize(TANGENT);
|
||
|
|
||
|
BINORMAL = vec3(0.0, 1.0, 0.0) * abs(normal.x);
|
||
|
BINORMAL += vec3(0.0, 0.0, -1.0) * abs(normal.y);
|
||
|
BINORMAL += vec3(0.0, 1.0, 0.0) * abs(normal.z);
|
||
|
BINORMAL = inverse(MODEL_NORMAL_MATRIX) * normalize(BINORMAL);
|
||
|
|
||
|
// UV1 Triplanar: Enabled (with World Triplanar)
|
||
|
uv1_power_normal = pow(abs(normal), vec3(uv1_blend_sharpness));
|
||
|
uv1_triplanar_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz * uv1_scale + uv1_offset;
|
||
|
uv1_power_normal /= dot(uv1_power_normal, vec3(1.0));
|
||
|
uv1_triplanar_pos *= vec3(1.0, -1.0, 1.0);
|
||
|
}
|
||
|
|
||
|
vec4 triplanar_texture(sampler2D p_sampler, vec3 p_weights, vec3 p_triplanar_pos)
|
||
|
{
|
||
|
vec4 samp = vec4(0.0);
|
||
|
samp += texture(p_sampler, p_triplanar_pos.xy) * p_weights.z;
|
||
|
samp += texture(p_sampler, p_triplanar_pos.xz) * p_weights.y;
|
||
|
samp += texture(p_sampler, p_triplanar_pos.zy * vec2(-1.0, 1.0)) * p_weights.x;
|
||
|
return samp;
|
||
|
}
|
||
|
|
||
|
void fragment()
|
||
|
{
|
||
|
vec4 albedo_tex = triplanar_texture(texture_albedo, uv1_power_normal, uv1_triplanar_pos);
|
||
|
ALBEDO = albedo.rgb * albedo_tex.rgb;
|
||
|
|
||
|
float metallic_tex = dot(triplanar_texture(texture_metallic, uv1_power_normal, uv1_triplanar_pos), metallic_texture_channel);
|
||
|
METALLIC = metallic_tex * metallic;
|
||
|
SPECULAR = specular;
|
||
|
|
||
|
vec4 roughness_texture_channel = vec4(1.0, 0.0, 0.0, 0.0);
|
||
|
float roughness_tex = dot(triplanar_texture(texture_roughness, uv1_power_normal, uv1_triplanar_pos), roughness_texture_channel);
|
||
|
ROUGHNESS = roughness_tex * roughness;
|
||
|
|
||
|
vec3 worldNormal = computeNormalFromHeightMap( heightMap, heightUV, normalTexelSize, normalHeightSize );
|
||
|
NORMAL = worldToViewDirection( worldNormal, VIEW_MATRIX );
|
||
|
// Normal Map: Enabled
|
||
|
NORMAL_MAP = triplanar_texture(texture_normal, uv1_power_normal, uv1_triplanar_pos).rgb;
|
||
|
NORMAL_MAP_DEPTH = normal_scale;
|
||
|
}
|