94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|   | // NOTE: Shader automatically converted from Godot Engine 4.4.stable.mono's StandardMaterial3D. | ||
|  | 
 | ||
|  | shader_type spatial; | ||
|  | render_mode blend_mix, depth_draw_opaque, cull_disabled, unshaded; | ||
|  | 
 | ||
|  | uniform sampler2D texture_albedo : source_color, filter_linear_mipmap, repeat_enable; | ||
|  | uniform vec2 resolution; | ||
|  | uniform int maxRadius = 32; | ||
|  | uniform int alphaTreshold:hint_range(1,255) = 1; | ||
|  | uniform int genericAlphaOffset:hint_range(0,255) = 9; | ||
|  | uniform int assignedColorAlphaMinimum:hint_range(0,255) = 0; | ||
|  | uniform float amount:hint_range(0,1)=1; | ||
|  | 
 | ||
|  | 
 | ||
|  | vec4 getPaddingColor( vec2 uv, vec2 pixelSize, int closestDistance, float t ) | ||
|  | {   | ||
|  |   vec4 closestPixel = texture( texture_albedo, uv ); | ||
|  |    | ||
|  |   if ( closestPixel.a >= t ) | ||
|  |   { | ||
|  |     return closestPixel / closestPixel.a;; | ||
|  |   } | ||
|  |    | ||
|  |   for ( int x = -maxRadius; x <= maxRadius; ++x ) | ||
|  |   { | ||
|  |     for ( int y = -maxRadius; y <= maxRadius; ++y ) | ||
|  |     { | ||
|  |       int d = x * x + y * y;  | ||
|  |        | ||
|  |       if ( d >= closestDistance ) | ||
|  |       { | ||
|  |         continue; | ||
|  |       } | ||
|  |        | ||
|  |       vec2 pUV = uv + pixelSize * vec2( float( x ), float( y ) ); | ||
|  |       vec4 pixel = texture( texture_albedo, pUV ); | ||
|  |        | ||
|  |       if ( pixel.a >= t ) | ||
|  |       { | ||
|  |         closestPixel   = pixel / pixel.a; | ||
|  |         closestPixel.a = pixel.a; | ||
|  |         closestDistance = d; | ||
|  |       }       | ||
|  |        | ||
|  |     }   | ||
|  |   } | ||
|  |    | ||
|  |   return closestPixel;   | ||
|  | } | ||
|  | 
 | ||
|  | varying vec2 pixelSize; | ||
|  | varying float closestDistance; | ||
|  | const float halfSquare = pow( 2.0, 0.5 ) * 0.5; | ||
|  | varying float tresholdFloat; | ||
|  | varying float assignedColorAlphaMinimumFloat; | ||
|  | varying float genericAlphaOffsetFloat; | ||
|  | 
 | ||
|  | void vertex() | ||
|  | { | ||
|  |   pixelSize = vec2( 1.0 / resolution.x, 1.0 / resolution.y ); | ||
|  |    | ||
|  |   float range = float( maxRadius ) * halfSquare; | ||
|  |   closestDistance = ( range * range + range * range ); | ||
|  |    | ||
|  |   tresholdFloat = float( alphaTreshold ) / 255.0; | ||
|  |   assignedColorAlphaMinimumFloat = float( assignedColorAlphaMinimum ) / 255.0; | ||
|  |   genericAlphaOffsetFloat = float( genericAlphaOffset ) / 255.0; | ||
|  | } | ||
|  | 
 | ||
|  | void fragment()  | ||
|  | {     | ||
|  |    | ||
|  |   vec2 pixelPerfectUV = round( UV * resolution ) / resolution;    | ||
|  |   vec4 original = texture( texture_albedo, pixelPerfectUV ); | ||
|  |    | ||
|  |   if ( original.a == 1.0 ) | ||
|  |   { | ||
|  |     ALBEDO =  original.rgb; | ||
|  |  	  ALPHA  =  original.a; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     int closestDistanceInteger = int( closestDistance ); | ||
|  |     vec4 outputColor = getPaddingColor( pixelPerfectUV, pixelSize, closestDistanceInteger, tresholdFloat );   | ||
|  | 
 | ||
|  |     outputColor.a = max( original.a, outputColor.a > 0.0 ? assignedColorAlphaMinimumFloat : 0.0 ); | ||
|  |      | ||
|  |  	  ALBEDO =  mix( original.rgb, outputColor.rgb, amount ); | ||
|  |  	  ALPHA  =  mix( original.a, min( 1, outputColor.a + genericAlphaOffsetFloat ), amount ); | ||
|  |   } | ||
|  | 
 | ||
|  |    | ||
|  | } |