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 );
 | |
|   }
 | |
| 
 | |
|   
 | |
| }
 |