rj-action-library/Runtime/Rendering/Assets/Foliage/GPUFoliageGroundCoverage.gd...

76 lines
2.5 KiB
Plaintext
Raw Permalink Normal View History

2025-07-17 11:50:37 +00:00
shader_type spatial;
render_mode blend_mix, depth_draw_never, 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/Math.gdshaderinc"
uniform vec4 albedo : source_color;
uniform sampler2D albedoTexture: source_color, filter_linear_mipmap, repeat_enable;
uniform float albedoUV;
uniform float albedoFadeDistance;
uniform sampler2D opacity : filter_linear_mipmap, repeat_enable;
uniform float opacityVarianceScale = 1.0;
uniform float opacityScale = 1.0;
uniform float opacityTreshold = 0.5;
uniform float opacityVarianceScale2 = 1.0;
uniform float opacityScale2 = 1.0;
uniform float opacityTreshold2 = 0.5;
uniform float opacity2Amount: hint_range( 0.0, 1.0 ) = 0.5;
uniform float roughness : hint_range( 0.0, 1.0 );
uniform float specular : hint_range( 0.0, 1.0 );
uniform float metallic : hint_range( 0.0, 1.0 );
uniform sampler2D texture_normal : hint_roughness_normal, filter_linear_mipmap, repeat_enable;
uniform float normal_scale : hint_range(0, 2);
uniform float normal_uv = 1.0;
uniform vec2 mapSize;
uniform vec2 mapCenter;
uniform float fadeOutMax;
uniform float fadeOutStart;
varying vec2 positionUV;
void vertex()
{
VERTEX += CAMERA_POSITION_WORLD * vec3( 1.0, 0.0, 1.0);
positionUV = UV;
UV = worldUVfromLocalXZ( VERTEX, mapCenter, mapSize, MODEL_MATRIX );
}
void fragment()
{
vec2 uv = UV;
float d = length( positionUV - vec2( 0.5, 0.5 ) );
float fading = 1.0 - clamp01( d / 0.5 );
float albedoFading = 1.0 - clamp01( d / albedoFadeDistance );
vec4 sampledAlbedo = texture( albedoTexture, uv * albedoUV );
ALBEDO = albedo.rgb * mix( vec3( 1, 1, 1 ), sampledAlbedo.rgb, albedoFading );
METALLIC = metallic;
SPECULAR = specular;
ROUGHNESS = roughness;
float sampledOpacity = texture( opacity, uv * opacityVarianceScale ).r;
sampledOpacity = ( sampledOpacity - opacityTreshold ) * opacityScale + opacityTreshold;
sampledOpacity = clamp01( sampledOpacity );
float sampledOpacity2 = texture( opacity, uv * opacityVarianceScale2 ).r;
sampledOpacity2 = ( sampledOpacity2 - opacityTreshold2 ) * opacityScale2 + opacityTreshold2;
sampledOpacity2 = mix( 1, clamp01( sampledOpacity2 ), opacity2Amount );
NORMAL_MAP = texture( texture_normal, uv * normal_uv ).rgb;
NORMAL_MAP_DEPTH = normal_scale;
ALPHA *= albedo.a * sampledOpacity * sampledOpacity2 * mix( 1, sampledAlbedo.a, albedoFading ) * fading;
}