Compositor Effects Update
This commit is contained in:
parent
50e4bf74b4
commit
89138f1a1c
|
@ -13,7 +13,6 @@ namespace Rokojori
|
||||||
RokojoriPlugin.Path( "Runtime/Rendering/CompositorEffects/DepthAntiAliasing/DepthAntiAliasingShader.glsl" );
|
RokojoriPlugin.Path( "Runtime/Rendering/CompositorEffects/DepthAntiAliasing/DepthAntiAliasingShader.glsl" );
|
||||||
|
|
||||||
|
|
||||||
RDPushConstants constants = new RDPushConstants();
|
|
||||||
RDSampler sampler;
|
RDSampler sampler;
|
||||||
|
|
||||||
[Export( PropertyHint.Range, "0,1") ]
|
[Export( PropertyHint.Range, "0,1") ]
|
||||||
|
@ -56,7 +55,7 @@ namespace Rokojori
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected override void ForAllViews()
|
protected override void SetConstants()
|
||||||
{
|
{
|
||||||
constants.Set(
|
constants.Set(
|
||||||
(Vector2)context.internalSize,
|
(Vector2)context.internalSize,
|
||||||
|
|
|
@ -39,9 +39,7 @@ namespace Rokojori
|
||||||
sampler = Sampler( RenderingDevice.SamplerFilter.Nearest, RenderingDevice.SamplerRepeatMode.ClampToEdge );
|
sampler = Sampler( RenderingDevice.SamplerFilter.Nearest, RenderingDevice.SamplerRepeatMode.ClampToEdge );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void SetConstants()
|
||||||
|
|
||||||
protected override void ForAllViews()
|
|
||||||
{
|
{
|
||||||
constants.Set(
|
constants.Set(
|
||||||
(Vector2)context.internalSize,
|
(Vector2)context.internalSize,
|
||||||
|
|
|
@ -20,9 +20,7 @@ namespace Rokojori
|
||||||
_groupSize = 8;
|
_groupSize = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
RDPushConstants constants = new RDPushConstants();
|
protected override void SetConstants()
|
||||||
|
|
||||||
protected override void ForAllViews()
|
|
||||||
{
|
{
|
||||||
constants.Set(
|
constants.Set(
|
||||||
(Vector2)context.internalSize,
|
(Vector2)context.internalSize,
|
||||||
|
|
|
@ -25,9 +25,7 @@ namespace Rokojori
|
||||||
_groupSize = 8;
|
_groupSize = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
RDPushConstants constants = new RDPushConstants();
|
protected override void SetConstants()
|
||||||
|
|
||||||
protected override void ForAllViews()
|
|
||||||
{
|
{
|
||||||
constants.Set(
|
constants.Set(
|
||||||
(Vector2)context.internalSize,
|
(Vector2)context.internalSize,
|
||||||
|
|
|
@ -31,9 +31,8 @@ namespace Rokojori
|
||||||
_groupSize = 32;
|
_groupSize = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
RDPushConstants constants = new RDPushConstants();
|
|
||||||
|
|
||||||
protected override void ForAllViews()
|
protected override void SetConstants()
|
||||||
{
|
{
|
||||||
constants.Set(
|
constants.Set(
|
||||||
center,
|
center,
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using Godot.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
[Tool]
|
||||||
|
[GlobalClass]
|
||||||
|
public partial class RadialBlur2:_XX_CompositorEffectGraph
|
||||||
|
{
|
||||||
|
public RadialBlur2()
|
||||||
|
{
|
||||||
|
CreateGraphNodes();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Vector2 center = new Vector2( 0.5f, 0.5f );
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public float radius = 0.5f;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public float intensity = 0.5f;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public float samples = 16f;
|
||||||
|
|
||||||
|
|
||||||
|
CEG_ScreenColorTexure screenColorTexture;
|
||||||
|
CEG_BufferTexture bufferTexture;
|
||||||
|
|
||||||
|
CEG_Copy copy;
|
||||||
|
CEG_RadialBlur radialBlur;
|
||||||
|
|
||||||
|
|
||||||
|
void Initialize()
|
||||||
|
{
|
||||||
|
CreateGraphNodes();
|
||||||
|
ConnectGraph();
|
||||||
|
AssignData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateGraphNodes()
|
||||||
|
{
|
||||||
|
screenColorTexture = new CEG_ScreenColorTexure( this );
|
||||||
|
bufferTexture = CEG_BufferTexture.ScreenSize( this );
|
||||||
|
|
||||||
|
copy = new CEG_Copy( this );
|
||||||
|
radialBlur = new CEG_RadialBlur( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConnectGraph()
|
||||||
|
{
|
||||||
|
copy.SetTextureSlotInputs( screenColorTexture, bufferTexture );
|
||||||
|
radialBlur.SetTextureSlotInputs( copy.output, copy.input );
|
||||||
|
|
||||||
|
|
||||||
|
SetProcessOrder(
|
||||||
|
screenColorTexture, bufferTexture,
|
||||||
|
copy, radialBlur
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AssignData()
|
||||||
|
{
|
||||||
|
radialBlur.constants.Set(
|
||||||
|
center,
|
||||||
|
radius,
|
||||||
|
intensity,
|
||||||
|
samples,
|
||||||
|
Vector2.Zero
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnPreProcess()
|
||||||
|
{
|
||||||
|
AssignData();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dq0uf1bqoefv
|
|
@ -0,0 +1,39 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0)
|
||||||
|
uniform restrict image2D lastProcessedImage;
|
||||||
|
|
||||||
|
layout(rgba16, set = 1, binding = 0)
|
||||||
|
uniform restrict image2D currentImage;
|
||||||
|
|
||||||
|
layout( push_constant, std430 )
|
||||||
|
uniform Params
|
||||||
|
{
|
||||||
|
float amount;
|
||||||
|
float smearing;
|
||||||
|
float luma;
|
||||||
|
float minBrightness;
|
||||||
|
float saturate;
|
||||||
|
|
||||||
|
} params;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
|
||||||
|
vec4 currentPixel = imageLoad( currentImage, currentPosition );
|
||||||
|
vec4 lastPixel = imageLoad( lastProcessedImage, currentPosition );
|
||||||
|
|
||||||
|
float luminance = min( 1.0, length( vec3( lastPixel.r, lastPixel.g, lastPixel.b ) ) );
|
||||||
|
float amount = ( luminance - params.minBrightness ) / ( 1.0 - params.minBrightness );
|
||||||
|
amount = min( max( 0.0, amount * params.saturate ), 1.0 ) * params.smearing;
|
||||||
|
amount = mix( 1.0, amount, params.luma );
|
||||||
|
vec4 nextPixel = currentPixel + min( 1.0, amount * params.smearing ) * ( lastPixel - currentPixel );
|
||||||
|
|
||||||
|
|
||||||
|
imageStore( currentImage, currentPosition, mix( currentPixel, nextPixel, params.amount ) );
|
||||||
|
imageStore( lastProcessedImage, currentPosition, nextPixel );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://cd1ysd752pjrn"
|
||||||
|
path="res://.godot/imported/TemporalSmear.glsl-b228c3fd9c0b0985d61f64e14d6b8842.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/CompositorEffects/TemporalSmear/TemporalSmear.glsl"
|
||||||
|
dest_files=["res://.godot/imported/TemporalSmear.glsl-b228c3fd9c0b0985d61f64e14d6b8842.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using Godot.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
[Tool]
|
||||||
|
[GlobalClass]
|
||||||
|
public partial class TemporalSmearEffect:SingleShaderCompositorEffect
|
||||||
|
{
|
||||||
|
public static readonly string shaderPath =
|
||||||
|
RokojoriPlugin.Path( "Runtime/Rendering/CompositorEffects/TemporalSmear/TemporalSmear.glsl" );
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0,1")]
|
||||||
|
public float amount = 1f;
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0,1")]
|
||||||
|
public float smearing = 0.5f;
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0,1")]
|
||||||
|
public float lumaAmount = 0.5f;
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0,1")]
|
||||||
|
public float lumaTreshold = 0.5f;
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0.5,5")]
|
||||||
|
public float lumaSaturate = 1.3f;
|
||||||
|
|
||||||
|
|
||||||
|
protected override void OnConfigure()
|
||||||
|
{
|
||||||
|
EffectCallbackType = EffectCallbackTypeEnum.PostTransparent;
|
||||||
|
_shaderPath = shaderPath;
|
||||||
|
_groupSize = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected override void SetConstants()
|
||||||
|
{
|
||||||
|
constants.Set(
|
||||||
|
amount,
|
||||||
|
smearing,
|
||||||
|
lumaAmount,
|
||||||
|
lumaTreshold,
|
||||||
|
lumaSaturate
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
RDTexture _bufferTexture;
|
||||||
|
|
||||||
|
protected override void RenderView()
|
||||||
|
{
|
||||||
|
if ( _bufferTexture == null || _bufferTexture.size != context.internalSize )
|
||||||
|
{
|
||||||
|
if ( _bufferTexture != null )
|
||||||
|
{
|
||||||
|
rd.FreeRid( _bufferTexture.rid );
|
||||||
|
_bufferTexture = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_bufferTexture = RDTexture.Create( this, context.internalSize );
|
||||||
|
}
|
||||||
|
|
||||||
|
context.AssignUniformSet_Texture( _bufferTexture );
|
||||||
|
context.Assign_ScreenColorTexture();
|
||||||
|
|
||||||
|
|
||||||
|
context.pushConstants = constants;
|
||||||
|
|
||||||
|
context.Render();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://djyhjsfnb6cxw
|
|
@ -0,0 +1,18 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0)
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout(rgba16, set = 1, binding = 0)
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
vec4 currentPixel = imageLoad( inputImage, currentPosition );
|
||||||
|
|
||||||
|
imageStore( outputImage, currentPosition, currentPixel );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://b281d2ovcc1wm"
|
||||||
|
path="res://.godot/imported/Copy.glsl-440875809e1224bd8f12ab4747b61bfc.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/CompositorEffects/TextureDilation/Copy.glsl"
|
||||||
|
dest_files=["res://.godot/imported/Copy.glsl-440875809e1224bd8f12ab4747b61bfc.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0) uniform restrict readonly image2D inputImage;
|
||||||
|
layout(rgba16, set = 1, binding = 0) uniform restrict readonly image2D originalImage;
|
||||||
|
layout(rgba16, set = 2, binding = 0) uniform restrict writeonly image2D outputImage;
|
||||||
|
layout(std430, set = 3, binding = 0) buffer restrict readonly OutlinesSizeBuffer { int size; } osb;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 current_position = ivec2(gl_GlobalInvocationID.xy);
|
||||||
|
vec4 current_pixel = imageLoad(inputImage, current_position);
|
||||||
|
ivec2 current_seed_position = ivec2(packUnorm2x16(current_pixel.xy), packUnorm2x16(current_pixel.zw));
|
||||||
|
|
||||||
|
// The "rough" outline generated by the Jump Flood Algorithm contains all the pixels of the desired outline + some more
|
||||||
|
// If the current pixel is not a seed, then it can't be part of the outline
|
||||||
|
if (current_seed_position.x == 0 && current_seed_position.y == 0)
|
||||||
|
{
|
||||||
|
imageStore(outputImage, current_position, vec4(0.0f));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float distance_to_seed = distance(vec2(current_position), vec2(current_seed_position));
|
||||||
|
float outlinesSize = float(osb.size);
|
||||||
|
|
||||||
|
// The current pixel is outside the outline range
|
||||||
|
if (distance_to_seed > outlinesSize) {
|
||||||
|
imageStore(outputImage, current_position, vec4(0.0f));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 original_pixel = imageLoad(originalImage, current_seed_position);
|
||||||
|
|
||||||
|
// The current pixel is on the edge of the outline, outer side
|
||||||
|
if (distance_to_seed > outlinesSize - 1.0f)
|
||||||
|
{
|
||||||
|
float smoothing = 1.0f - (distance_to_seed - (outlinesSize - 1.0f));
|
||||||
|
imageStore(outputImage, current_position, vec4(original_pixel.xyz, smoothing));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The current pixel is part of the object to outline
|
||||||
|
if (distance_to_seed == 0.0f)
|
||||||
|
{
|
||||||
|
imageStore(outputImage, current_position, vec4(0.0f));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The current pixel is on the edge of the outline, inner side
|
||||||
|
if (distance_to_seed < 1.0f)
|
||||||
|
{
|
||||||
|
float smoothing = distance_to_seed;
|
||||||
|
imageStore(outputImage, current_position, vec4(original_pixel.xyz, smoothing));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The current pixel is part of the outline
|
||||||
|
imageStore(outputImage, current_position, vec4(original_pixel.xyz, original_pixel.a));
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://fjarrr31htov"
|
||||||
|
path="res://.godot/imported/JFA_Assign.glsl-d64da3d1862c7dbd2f410c2e5f98e270.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/CompositorEffects/TextureDilation/JFA_Assign.glsl"
|
||||||
|
dest_files=["res://.godot/imported/JFA_Assign.glsl-d64da3d1862c7dbd2f410c2e5f98e270.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout( local_size_x = 8, local_size_y = 8, local_size_z = 1 ) in;
|
||||||
|
|
||||||
|
layout( rgba16, set = 0, binding = 0 )
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout( rgba16, set = 1, binding = 0 )
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
layout( push_constant, std430 )
|
||||||
|
uniform Params
|
||||||
|
{
|
||||||
|
float alphaTreshold;
|
||||||
|
|
||||||
|
} params;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
vec4 currentPixel = imageLoad( inputImage, currentPosition );
|
||||||
|
|
||||||
|
if ( currentPixel.a < params.alphaTreshold )
|
||||||
|
{
|
||||||
|
vec4 packedZero = vec4( unpackUnorm2x16( 0 ), unpackUnorm2x16( 0 ) );
|
||||||
|
imageStore( outputImage, currentPosition, packedZero );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 packedPosition = vec4( unpackUnorm2x16( currentPosition.x ), unpackUnorm2x16( currentPosition.y ) );
|
||||||
|
imageStore( outputImage, currentPosition, packedPosition);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://eqgl8l1lmgrl"
|
||||||
|
path="res://.godot/imported/JFA_Initialize.glsl-8eec6889b219c52896e1b7597ec3dbbd.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/CompositorEffects/TextureDilation/JFA_Initialize.glsl"
|
||||||
|
dest_files=["res://.godot/imported/JFA_Initialize.glsl-8eec6889b219c52896e1b7597ec3dbbd.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0)
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout(rgba16, set = 1, binding = 0)
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
layout(std430, set = 2, binding = 0)
|
||||||
|
buffer restrict readonly JumpDistanceBuffer { int jump; } jdb;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
ivec2 imageSize = imageSize( inputImage );
|
||||||
|
|
||||||
|
float distanceToClosestSeed = 1.0f / 0.0f;
|
||||||
|
vec4 closestSeed = vec4( unpackUnorm2x16( 0 ), unpackUnorm2x16( 0 ) );
|
||||||
|
|
||||||
|
ivec2 jdbJump = ivec2( jdb.jump, jdb.jump );
|
||||||
|
|
||||||
|
for ( int x = -1; x <= 1; x++ )
|
||||||
|
{
|
||||||
|
for ( int y = -1; y <= 1; y++ )
|
||||||
|
{
|
||||||
|
ivec2 xy = ivec2( x, y );
|
||||||
|
|
||||||
|
ivec2 checkPosition = currentPosition + jdbJump * xy;
|
||||||
|
|
||||||
|
if ( checkPosition.x < 0 || checkPosition.y < 0 ||
|
||||||
|
checkPosition.x >= imageSize.x || checkPosition.y >= imageSize.y )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 checkPixel = imageLoad( inputImage, checkPosition );
|
||||||
|
float checkSeedX = float( packUnorm2x16( checkPixel.xy ) );
|
||||||
|
float checkSeedY = float( packUnorm2x16( checkPixel.zw ) );
|
||||||
|
|
||||||
|
vec2 checkSeedPosition = vec2( checkSeedX, checkSeedY );
|
||||||
|
|
||||||
|
if ( checkSeedPosition.x == 0.0f && checkSeedPosition.y == 0.0f )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
float distanceToSeed = distance( vec2( currentPosition ), checkSeedPosition );
|
||||||
|
|
||||||
|
if ( distanceToSeed < distanceToClosestSeed )
|
||||||
|
{
|
||||||
|
distanceToClosestSeed = distanceToSeed;
|
||||||
|
closestSeed = checkPixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imageStore( outputImage, currentPosition, closestSeed );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://b263k73iy5pbl"
|
||||||
|
path="res://.godot/imported/JFA_Step.glsl-89a0d568e1c875744d558d5c62c00f0b.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/CompositorEffects/TextureDilation/JFA_Step.glsl"
|
||||||
|
dest_files=["res://.godot/imported/JFA_Step.glsl-89a0d568e1c875744d558d5c62c00f0b.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -11,46 +11,26 @@ namespace Rokojori
|
||||||
{
|
{
|
||||||
[Tool]
|
[Tool]
|
||||||
[GlobalClass]
|
[GlobalClass]
|
||||||
public partial class TextureDilationCompositerEffect:CompositorEffect
|
public partial class TextureDilationCompositerEffect:_XX_CompositorEffectGraph
|
||||||
{
|
{
|
||||||
RenderingDevice renderingDevice;
|
public TextureDilationCompositerEffect()
|
||||||
Rid frameBuffer;
|
|
||||||
|
|
||||||
public void _Init()
|
|
||||||
{
|
{
|
||||||
EffectCallbackType = EffectCallbackTypeEnum.PostOpaque;
|
CreateGraph();
|
||||||
renderingDevice = RenderingServer.GetRenderingDevice();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _Notification(int what)
|
RDTexture color;
|
||||||
|
RDTexture bufferA;
|
||||||
|
RDTexture bufferB;
|
||||||
|
|
||||||
|
CEG_Copy copy;
|
||||||
|
|
||||||
|
void CreateGraph()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _RenderCallback( int effectCallbackType, RenderData renderData )
|
void AssignData()
|
||||||
{
|
{
|
||||||
if ( renderingDevice == null || effectCallbackType != (int) EffectCallbackTypeEnum.PostOpaque )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var renderBuffers = (RenderSceneBuffersRD) renderData.GetRenderSceneBuffers();
|
|
||||||
|
|
||||||
if ( renderBuffers == null )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var size = renderBuffers.GetInternalSize();
|
|
||||||
|
|
||||||
if ( size.X == 0 || size.Y == 0 )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var groups = new Vector3((size.X - 1.0f) / 8.0f + 1.0f, (size.Y - 1.0f) / 8.0f + 1.0f, 1.0f).Floor();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,12 @@ namespace Rokojori
|
||||||
{
|
{
|
||||||
public class CompositorEffectGraphConnection:CompositorEffectGraphNode
|
public class CompositorEffectGraphConnection:CompositorEffectGraphNode
|
||||||
{
|
{
|
||||||
public CompositorEffectGraphConnection( _XX_CompositorEffectGraph graph ):base( graph ){}
|
protected CompositorEffectGraphProcessor _processor;
|
||||||
|
|
||||||
|
public CompositorEffectGraphConnection( CompositorEffectGraphProcessor processor ):base( processor.graph )
|
||||||
|
{
|
||||||
|
_processor = processor;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,10 +0,0 @@
|
||||||
|
|
||||||
using Godot;
|
|
||||||
|
|
||||||
namespace Rokojori
|
|
||||||
{
|
|
||||||
public class CompositorEffectGraphInput:CompositorEffectGraphConnection
|
|
||||||
{
|
|
||||||
public CompositorEffectGraphInput( _XX_CompositorEffectGraph graph ):base( graph ){}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
uid://d2eejfvpgahbr
|
|
|
@ -1,10 +0,0 @@
|
||||||
|
|
||||||
using Godot;
|
|
||||||
|
|
||||||
namespace Rokojori
|
|
||||||
{
|
|
||||||
public class CompositorEffectGraphOutput:CompositorEffectGraphConnection
|
|
||||||
{
|
|
||||||
public CompositorEffectGraphOutput( _XX_CompositorEffectGraph graph ):base( graph ){}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
uid://c1tsn5wy1vpmx
|
|
|
@ -1,10 +1,13 @@
|
||||||
|
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Rokojori
|
namespace Rokojori
|
||||||
{
|
{
|
||||||
public class CompositorEffectGraphProcessor:CompositorEffectGraphNode
|
public class CompositorEffectGraphProcessor:CompositorEffectGraphNode
|
||||||
{
|
{
|
||||||
|
protected List<CompositorEffectGraphConnection> _connections = new List<CompositorEffectGraphConnection>();
|
||||||
|
|
||||||
public CompositorEffectGraphProcessor( _XX_CompositorEffectGraph graph ):base( graph ){}
|
public CompositorEffectGraphProcessor( _XX_CompositorEffectGraph graph ):base( graph ){}
|
||||||
|
|
||||||
bool _initialized = false;
|
bool _initialized = false;
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public interface CompositorEffectGraphTextureSlotInput
|
||||||
|
{
|
||||||
|
public RDTexture GetTexture();
|
||||||
|
public CompositorEffectGraphProcessor GetProcessor();
|
||||||
|
public void SetConnected( CompositorEffectGraphTextureSlot slot );
|
||||||
|
public void ConnectTo( CompositorEffectGraphTextureSlot slot );
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CompositorEffectGraphTextureSlot:CompositorEffectGraphConnection, CompositorEffectGraphTextureSlotInput
|
||||||
|
{
|
||||||
|
protected CompositorEffectGraphTextureSlotInput _input;
|
||||||
|
public CompositorEffectGraphTextureSlotInput input => _input;
|
||||||
|
|
||||||
|
public RDSampler sampler;
|
||||||
|
|
||||||
|
RDTexture _texture;
|
||||||
|
|
||||||
|
public RDTexture GetTexture()
|
||||||
|
{
|
||||||
|
return _texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RDTexture ResolveTexture()
|
||||||
|
{
|
||||||
|
return _texture = _input.GetTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositorEffectGraphProcessor GetProcessor()
|
||||||
|
{
|
||||||
|
return _processor;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CompositorEffectGraphTextureSlot> _connectedSlots = new List<CompositorEffectGraphTextureSlot>();
|
||||||
|
|
||||||
|
public void SetConnected( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
_connectedSlots.Add( slot );
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositorEffectGraphTextureSlot( CompositorEffectGraphProcessor processor ):base( processor )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetInput( CompositorEffectGraphTextureSlotInput input )
|
||||||
|
{
|
||||||
|
_input = input;
|
||||||
|
input.SetConnected( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConnectTo( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
slot.SetInput( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dpvnjuwxoc47d
|
|
@ -16,8 +16,9 @@ namespace Rokojori
|
||||||
protected RDShader _shader;
|
protected RDShader _shader;
|
||||||
protected RDPipeline _pipeline;
|
protected RDPipeline _pipeline;
|
||||||
protected RDPushConstants _constants;
|
protected RDPushConstants _constants;
|
||||||
protected List<RDUniformSet> _uniformSets = new List<RDUniformSet>();
|
public RDPushConstants constants => _constants;
|
||||||
|
protected Vector3I _groupSize = new Vector3I( 8, 8, 0 );
|
||||||
|
protected List<CompositorEffectGraphTextureSlot> _textureSlots = new List<CompositorEffectGraphTextureSlot>();
|
||||||
|
|
||||||
protected override void OnInitialize()
|
protected override void OnInitialize()
|
||||||
{
|
{
|
||||||
|
@ -61,9 +62,16 @@ namespace Rokojori
|
||||||
var context = graph.context;
|
var context = graph.context;
|
||||||
|
|
||||||
context.Clear();
|
context.Clear();
|
||||||
|
context.ComputeGroups( _groupSize );
|
||||||
context.SetShaderAndPipeline( _shader, _pipeline );
|
context.SetShaderAndPipeline( _shader, _pipeline );
|
||||||
|
|
||||||
_uniformSets.ForEach( context.AddUniformSet );
|
_textureSlots.ForEach( t =>
|
||||||
|
{
|
||||||
|
t.ResolveTexture();
|
||||||
|
graph.context.AssignUniformSet_Texture( t.GetTexture(), t.sampler );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
context.pushConstants = _constants;
|
context.pushConstants = _constants;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_RadialBlur:CEG_ImageProcessor
|
||||||
|
{
|
||||||
|
public static readonly string shaderPath =
|
||||||
|
_XX_CompositorEffectGraph.Path( "Nodes/Processors/Blurs/RadialBlur/RadialBlur.glsl" );
|
||||||
|
|
||||||
|
public CEG_RadialBlur( _XX_CompositorEffectGraph graph ):base( graph, shaderPath )
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://d3ab6f77ogsxg
|
|
@ -0,0 +1,51 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout( local_size_x = 8, local_size_y = 8, local_size_z = 1 ) in;
|
||||||
|
|
||||||
|
layout( rgba16f, set = 0, binding = 0 )
|
||||||
|
uniform image2D inputImage;
|
||||||
|
layout( rgba16f, set = 1, binding = 0 )
|
||||||
|
uniform image2D outputImage;
|
||||||
|
|
||||||
|
|
||||||
|
layout( push_constant, std430 )
|
||||||
|
uniform Params
|
||||||
|
{
|
||||||
|
vec2 center; // 8 bytes
|
||||||
|
float radius; // 4 bytes
|
||||||
|
float intensity; // 4 bytes
|
||||||
|
float samples; // 4 bytes ( will be cast to int )
|
||||||
|
vec2 _padding; // 8 bytes ( matches 32-byte total )
|
||||||
|
|
||||||
|
} params;
|
||||||
|
|
||||||
|
void main( )
|
||||||
|
{
|
||||||
|
ivec2 img_size = imageSize( inputImage );
|
||||||
|
ivec2 texel_coord = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
|
||||||
|
if ( any( greaterThanEqual( texel_coord, img_size ) ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 uv = ( vec2( texel_coord ) + 0.5 ) / vec2( img_size );
|
||||||
|
vec2 dir = normalize( uv - params.center );
|
||||||
|
int num_samples = int( clamp( params.samples, 1.0, 64.0 ) );
|
||||||
|
|
||||||
|
vec4 color = vec4( 0.0 );
|
||||||
|
|
||||||
|
for ( int i = 0; i < num_samples; i++ )
|
||||||
|
{
|
||||||
|
float t = float( i ) / float( num_samples );
|
||||||
|
vec2 sample_uv = clamp( uv + dir * t * params.radius, vec2( 0.0 ), vec2( 1.0 ) );
|
||||||
|
ivec2 sample_coord = ivec2( sample_uv * vec2( img_size ) );
|
||||||
|
sample_coord = clamp( sample_coord, ivec2( 0 ), img_size - ivec2( 1 ) );
|
||||||
|
color += imageLoad( inputImage, sample_coord );
|
||||||
|
}
|
||||||
|
|
||||||
|
color /= float( num_samples );
|
||||||
|
vec4 original_color = imageLoad( inputImage, texel_coord );
|
||||||
|
imageStore( outputImage, texel_coord, mix( original_color, color, params.intensity ) );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://bqsb2a6poa7b0"
|
||||||
|
path="res://.godot/imported/RadialBlur.glsl-2a7bbca9e049b45a9edfab7b714dd886.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/Objects/CompositorEffectGraph/Nodes/Processors/Blurs/RadialBlur/RadialBlur.glsl"
|
||||||
|
dest_files=["res://.godot/imported/RadialBlur.glsl-2a7bbca9e049b45a9edfab7b714dd886.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_Copy:CEG_ImageProcessor
|
||||||
|
{
|
||||||
|
public static readonly string shaderPath =
|
||||||
|
_XX_CompositorEffectGraph.Path( "Nodes/Processors/Copy/CopyShader.glsl" );
|
||||||
|
|
||||||
|
public CEG_Copy( _XX_CompositorEffectGraph graph ):base( graph, shaderPath )
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cdgu20aruad5x
|
|
@ -0,0 +1,18 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0)
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout(rgba16, set = 1, binding = 0)
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
vec4 currentPixel = imageLoad( inputImage, currentPosition );
|
||||||
|
|
||||||
|
imageStore( outputImage, currentPosition, currentPixel );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://dkmulxqa0tvis"
|
||||||
|
path="res://.godot/imported/Copy.glsl-04e877248c733e7d624480658e605c4c.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/Objects/CompositorEffectGraph/Nodes/Processors/Copy/Copy.glsl"
|
||||||
|
dest_files=["res://.godot/imported/Copy.glsl-04e877248c733e7d624480658e605c4c.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_TextureCreator
|
||||||
|
{
|
||||||
|
public bool autoClean = true;
|
||||||
|
|
||||||
|
public void AutoClean( RDTexture texture, RenderingDevice rd )
|
||||||
|
{
|
||||||
|
if ( texture == null || ! autoClean )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rd.FreeRid( texture.rid );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual RDTexture Create( RDTexture texture, _XX_CompositorEffectGraph graph )
|
||||||
|
{
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CEG_TextureCreator_ScreenSize:CEG_TextureCreator
|
||||||
|
{
|
||||||
|
public RDTextureFormat format = RDTexture.DefaultFormat( -1, -1 );
|
||||||
|
public Vector2 scale = Vector2.One;
|
||||||
|
|
||||||
|
public override RDTexture Create( RDTexture texture, _XX_CompositorEffectGraph graph )
|
||||||
|
{
|
||||||
|
Vector2I scaledSize = (Vector2I) ( graph.context.internalSize * scale );
|
||||||
|
|
||||||
|
if ( texture == null || scaledSize != texture.size )
|
||||||
|
{
|
||||||
|
AutoClean( texture, graph.rd );
|
||||||
|
format = RDTexture.FormatChangeSize( format, scaledSize );
|
||||||
|
texture = RDTexture.Create( graph, format );
|
||||||
|
}
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CEG_TextureCreator_FixedSize:CEG_TextureCreator
|
||||||
|
{
|
||||||
|
public RDTextureFormat format = RDTexture.DefaultFormat( -1, -1 );
|
||||||
|
|
||||||
|
public override RDTexture Create( RDTexture texture, _XX_CompositorEffectGraph graph )
|
||||||
|
{
|
||||||
|
var formatSize = new Vector2I( (int) format.Width, (int) format.Height );
|
||||||
|
|
||||||
|
if ( texture == null || texture.size != formatSize )
|
||||||
|
{
|
||||||
|
AutoClean( texture, graph.rd );
|
||||||
|
texture = RDTexture.Create( graph, format );
|
||||||
|
}
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class CEG_BufferTexture:CompositorEffectGraphProcessor, CompositorEffectGraphTextureSlotInput
|
||||||
|
{
|
||||||
|
RDTexture _texture;
|
||||||
|
|
||||||
|
CEG_TextureCreator _creator;
|
||||||
|
|
||||||
|
|
||||||
|
public RDTexture GetTexture()
|
||||||
|
{
|
||||||
|
return _texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositorEffectGraphProcessor GetProcessor()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CompositorEffectGraphTextureSlot> _connectedSlots = new List<CompositorEffectGraphTextureSlot>();
|
||||||
|
|
||||||
|
public void SetConnected( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
_connectedSlots.Add( slot );
|
||||||
|
}
|
||||||
|
|
||||||
|
public CEG_BufferTexture( _XX_CompositorEffectGraph graph, CEG_TextureCreator creator ):base( graph )
|
||||||
|
{
|
||||||
|
_creator = creator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CEG_BufferTexture ScreenSize( _XX_CompositorEffectGraph graph, Vector2? scale = null )
|
||||||
|
{
|
||||||
|
var screenSize = new CEG_TextureCreator_ScreenSize();
|
||||||
|
screenSize.scale = scale == null ? Vector2.One : (Vector2) scale;
|
||||||
|
return new CEG_BufferTexture( graph, screenSize );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CEG_BufferTexture FixedSize( _XX_CompositorEffectGraph graph )
|
||||||
|
{
|
||||||
|
return new CEG_BufferTexture( graph, new CEG_TextureCreator_FixedSize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
_texture = _creator.Create( _texture, graph );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConnectTo( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
slot.SetInput( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://daci8anid6cir
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_ImageProcessor:CompositorEffectShaderProcessor
|
||||||
|
{
|
||||||
|
public readonly CompositorEffectGraphTextureSlot input;
|
||||||
|
public readonly CompositorEffectGraphTextureSlot output;
|
||||||
|
|
||||||
|
public CEG_ImageProcessor( _XX_CompositorEffectGraph graph, string shaderPath ):base( graph, shaderPath )
|
||||||
|
{
|
||||||
|
input = new CompositorEffectGraphTextureSlot( this );
|
||||||
|
output = new CompositorEffectGraphTextureSlot( this );
|
||||||
|
|
||||||
|
_textureSlots.AddRange( new List<CompositorEffectGraphTextureSlot>{ input, output } );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextureSlotInputs( CompositorEffectGraphTextureSlotInput inputSlot, CompositorEffectGraphTextureSlotInput outputSlot )
|
||||||
|
{
|
||||||
|
inputSlot.ConnectTo( input );
|
||||||
|
outputSlot.ConnectTo( output );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextureSlotInputs( CEG_ImageProcessor imageProcessorBefore )
|
||||||
|
{
|
||||||
|
imageProcessorBefore.input.ConnectTo( input );
|
||||||
|
imageProcessorBefore.output.ConnectTo( output );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://ti4bnqj6ly2d
|
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_ScreenColorTexure:CompositorEffectGraphProcessor, CompositorEffectGraphTextureSlotInput
|
||||||
|
{
|
||||||
|
RDTexture _texture;
|
||||||
|
|
||||||
|
public RDTexture GetTexture()
|
||||||
|
{
|
||||||
|
return _texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositorEffectGraphProcessor GetProcessor()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CompositorEffectGraphTextureSlot> _connectedSlots = new List<CompositorEffectGraphTextureSlot>();
|
||||||
|
|
||||||
|
public void SetConnected( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
_connectedSlots.Add( slot );
|
||||||
|
}
|
||||||
|
|
||||||
|
public CEG_ScreenColorTexure( _XX_CompositorEffectGraph graph ):base( graph )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
_texture = graph.context.GetScreenColorTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConnectTo( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
slot.SetInput( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bor4qhl6i4v71
|
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_ScreenDepthTexture:CompositorEffectGraphProcessor, CompositorEffectGraphTextureSlotInput
|
||||||
|
{
|
||||||
|
RDTexture _texture;
|
||||||
|
|
||||||
|
public RDTexture GetTexture()
|
||||||
|
{
|
||||||
|
return _texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositorEffectGraphProcessor GetProcessor()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CompositorEffectGraphTextureSlot> _connectedSlots = new List<CompositorEffectGraphTextureSlot>();
|
||||||
|
|
||||||
|
public void SetConnected( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
_connectedSlots.Add( slot );
|
||||||
|
}
|
||||||
|
|
||||||
|
public CEG_ScreenDepthTexture( _XX_CompositorEffectGraph graph ):base( graph )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
_texture = graph.context.GetScreenDepthTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConnectTo( CompositorEffectGraphTextureSlot slot )
|
||||||
|
{
|
||||||
|
slot.SetInput( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bnre87prtmdm8
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_JFAInitialize:CEG_ImageProcessor
|
||||||
|
{
|
||||||
|
public static readonly string shaderPath =
|
||||||
|
_XX_CompositorEffectGraph.Path( "Nodes/Processors/JFA/JFA_Initialize.glsl" );
|
||||||
|
|
||||||
|
public CEG_JFAInitialize( _XX_CompositorEffectGraph graph ):base( graph, shaderPath )
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dy3tgi41tdhgx
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
using Godot;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class CEG_JFAIterate:CEG_ImageProcessor
|
||||||
|
{
|
||||||
|
public static readonly string shaderPath =
|
||||||
|
_XX_CompositorEffectGraph.Path( "Nodes/Processors/JFA/JFA_Iterate.glsl" );
|
||||||
|
|
||||||
|
public CEG_JFAIterate( _XX_CompositorEffectGraph graph ):base( graph, shaderPath )
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dhgflubjnh736
|
|
@ -0,0 +1,33 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout( local_size_x = 8, local_size_y = 8, local_size_z = 1 ) in;
|
||||||
|
|
||||||
|
layout( rgba16, set = 0, binding = 0 )
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout( rgba16, set = 1, binding = 0 )
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
layout( push_constant, std430 )
|
||||||
|
uniform Params
|
||||||
|
{
|
||||||
|
float alphaTreshold;
|
||||||
|
|
||||||
|
} params;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
vec4 currentPixel = imageLoad( inputImage, currentPosition );
|
||||||
|
|
||||||
|
if ( currentPixel.a < params.alphaTreshold )
|
||||||
|
{
|
||||||
|
vec4 packedZero = vec4( unpackUnorm2x16( 0 ), unpackUnorm2x16( 0 ) );
|
||||||
|
imageStore( outputImage, currentPosition, packedZero );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 packedPosition = vec4( unpackUnorm2x16( currentPosition.x ), unpackUnorm2x16( currentPosition.y ) );
|
||||||
|
imageStore( outputImage, currentPosition, packedPosition);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://diia0hlqqkna"
|
||||||
|
path="res://.godot/imported/JFA_Initialize.glsl-805a62d8bfe18f03d3fff707518fb98e.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/Objects/CompositorEffectGraph/Nodes/Processors/JFA/JFA_Initialize.glsl"
|
||||||
|
dest_files=["res://.godot/imported/JFA_Initialize.glsl-805a62d8bfe18f03d3fff707518fb98e.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
#[compute]
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||||||
|
|
||||||
|
layout(rgba16, set = 0, binding = 0)
|
||||||
|
uniform restrict readonly image2D inputImage;
|
||||||
|
|
||||||
|
layout(rgba16, set = 1, binding = 0)
|
||||||
|
uniform restrict writeonly image2D outputImage;
|
||||||
|
|
||||||
|
layout(std430, set = 2, binding = 0)
|
||||||
|
buffer restrict readonly JumpDistanceBuffer { int jump; } jdb;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
ivec2 currentPosition = ivec2( gl_GlobalInvocationID.xy );
|
||||||
|
ivec2 imageSize = imageSize( inputImage );
|
||||||
|
|
||||||
|
float distanceToClosestSeed = 1.0f / 0.0f;
|
||||||
|
vec4 closestSeed = vec4( unpackUnorm2x16( 0 ), unpackUnorm2x16( 0 ) );
|
||||||
|
|
||||||
|
ivec2 jdbJump = ivec2( jdb.jump, jdb.jump );
|
||||||
|
|
||||||
|
for ( int x = -1; x <= 1; x++ )
|
||||||
|
{
|
||||||
|
for ( int y = -1; y <= 1; y++ )
|
||||||
|
{
|
||||||
|
ivec2 xy = ivec2( x, y );
|
||||||
|
|
||||||
|
ivec2 checkPosition = currentPosition + jdbJump * xy;
|
||||||
|
|
||||||
|
if ( checkPosition.x < 0 || checkPosition.y < 0 ||
|
||||||
|
checkPosition.x >= imageSize.x || checkPosition.y >= imageSize.y )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 checkPixel = imageLoad( inputImage, checkPosition );
|
||||||
|
float checkSeedX = float( packUnorm2x16( checkPixel.xy ) );
|
||||||
|
float checkSeedY = float( packUnorm2x16( checkPixel.zw ) );
|
||||||
|
|
||||||
|
vec2 checkSeedPosition = vec2( checkSeedX, checkSeedY );
|
||||||
|
|
||||||
|
if ( checkSeedPosition.x == 0.0f && checkSeedPosition.y == 0.0f )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
float distanceToSeed = distance( vec2( currentPosition ), checkSeedPosition );
|
||||||
|
|
||||||
|
if ( distanceToSeed < distanceToClosestSeed )
|
||||||
|
{
|
||||||
|
distanceToClosestSeed = distanceToSeed;
|
||||||
|
closestSeed = checkPixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imageStore( outputImage, currentPosition, closestSeed );
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="glsl"
|
||||||
|
type="RDShaderFile"
|
||||||
|
uid="uid://dntu82sa6clb4"
|
||||||
|
path="res://.godot/imported/JFA_Iterate.glsl-7375b6aced2100cd0023eb6c61803e61.res"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/rokojori_action_library/Runtime/Rendering/Objects/CompositorEffectGraph/Nodes/Processors/JFA/JFA_Iterate.glsl"
|
||||||
|
dest_files=["res://.godot/imported/JFA_Iterate.glsl-7375b6aced2100cd0023eb6c61803e61.res"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
|
@ -8,6 +8,45 @@ namespace Rokojori
|
||||||
[GlobalClass]
|
[GlobalClass]
|
||||||
public partial class _XX_CompositorEffectGraph:RokojoriCompositorEffect
|
public partial class _XX_CompositorEffectGraph:RokojoriCompositorEffect
|
||||||
{
|
{
|
||||||
List<CompositorEffectGraphNode> _nodes;
|
public static readonly string path = "res://addons/rokojori_action_library/Runtime/Rendering/Objects/CompositorEffectGraph";
|
||||||
|
public static string Path( string subPath )
|
||||||
|
{
|
||||||
|
return path + "/" + subPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<CompositorEffectGraphNode> _nodes = new List<CompositorEffectGraphNode>();
|
||||||
|
protected List<CompositorEffectGraphProcessor> _processors = new List<CompositorEffectGraphProcessor>();
|
||||||
|
protected List<CompositorEffectGraphProcessor> _processOrder = new List<CompositorEffectGraphProcessor>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected void SetProcessOrder( List<CompositorEffectGraphProcessor> order )
|
||||||
|
{
|
||||||
|
_processOrder.Clear();
|
||||||
|
_processOrder.AddRange( order );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SetProcessOrder( params CompositorEffectGraphProcessor[] order )
|
||||||
|
{
|
||||||
|
_processOrder.Clear();
|
||||||
|
_processOrder.AddRange( order );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void RenderView()
|
||||||
|
{
|
||||||
|
OnPreProcess();
|
||||||
|
_processOrder.ForEach( p => p.Process() );
|
||||||
|
OnPostProcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void OnPreProcess()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void OnPostProcess()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,5 +25,91 @@ namespace Rokojori
|
||||||
|
|
||||||
return new RDTexture( context.effect, rid );
|
return new RDTexture( context.effect, rid );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RDTextureFormat format
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return effect.rd.TextureGetFormat( rid );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2I size
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var textureFormat = format;
|
||||||
|
return new Vector2I( (int) textureFormat.Width, (int) textureFormat.Height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTexture Create( RokojoriCompositorEffect effect, RDTextureFormat format )
|
||||||
|
{
|
||||||
|
var view = new RDTextureView();
|
||||||
|
var rid = effect.rd.TextureCreate( format, view );
|
||||||
|
return new RDTexture( effect, rid );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTextureFormat DefaultFormat( int w, int h, RenderingDevice.DataFormat dataFormat = RenderingDevice.DataFormat.R16G16B16A16Unorm )
|
||||||
|
{
|
||||||
|
var format = new RDTextureFormat();
|
||||||
|
|
||||||
|
format.Width = (uint) w;
|
||||||
|
format.Height = (uint) h;
|
||||||
|
format.Format = dataFormat;
|
||||||
|
format.UsageBits = RenderingDevice.TextureUsageBits.StorageBit | RenderingDevice.TextureUsageBits.SamplingBit;
|
||||||
|
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTextureFormat FormatChangeSize( RDTextureFormat tf, Vector2I size )
|
||||||
|
{
|
||||||
|
return FormatChangeSize( tf, size.X, size.Y );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTextureFormat FormatChangeSize( RDTextureFormat tf, int w, int h )
|
||||||
|
{
|
||||||
|
var clone = FormatCopy( tf );
|
||||||
|
clone.Width = (uint) w;
|
||||||
|
clone.Height = (uint) h;
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTextureFormat FormatCopy( RDTextureFormat tf )
|
||||||
|
{
|
||||||
|
var format = new RDTextureFormat();
|
||||||
|
|
||||||
|
format.Format = tf.Format;
|
||||||
|
|
||||||
|
format.Width = tf.Width;
|
||||||
|
format.Height = tf.Height;
|
||||||
|
format.Depth = tf.Depth;
|
||||||
|
|
||||||
|
format.ArrayLayers = tf.ArrayLayers;
|
||||||
|
format.Mipmaps = tf.Mipmaps;
|
||||||
|
format.TextureType = tf.TextureType;
|
||||||
|
format.Samples = tf.Samples;
|
||||||
|
format.UsageBits = tf.UsageBits;
|
||||||
|
format.IsResolveBuffer = tf.IsResolveBuffer;
|
||||||
|
format.IsDiscardable = tf.IsDiscardable;
|
||||||
|
|
||||||
|
return tf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTexture Create( RokojoriCompositorEffect effect, Vector2I size, RenderingDevice.DataFormat dataFormat = RenderingDevice.DataFormat.R16G16B16A16Unorm )
|
||||||
|
{
|
||||||
|
return Create( effect, size.X, size.Y, dataFormat );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RDTexture Create( RokojoriCompositorEffect effect, int width, int height,
|
||||||
|
RenderingDevice.DataFormat dataFormat = RenderingDevice.DataFormat.R16G16B16A16Unorm )
|
||||||
|
{
|
||||||
|
var view = new RDTextureView();
|
||||||
|
var format = DefaultFormat( width, height, dataFormat );
|
||||||
|
|
||||||
|
var rid = effect.rd.TextureCreate( format, view );
|
||||||
|
return new RDTexture( effect, rid );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -101,6 +101,27 @@ namespace Rokojori
|
||||||
pushConstants = null;
|
pushConstants = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetGroups( Vector3I groups )
|
||||||
|
{
|
||||||
|
this._groups = groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ComputeGroups( int groupSize )
|
||||||
|
{
|
||||||
|
ComputeGroups( new Vector3I( groupSize, groupSize, 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ComputeGroups( Vector3I groupSize )
|
||||||
|
{
|
||||||
|
var size = sceneBuffers.GetInternalSize();
|
||||||
|
|
||||||
|
var xGroups = Mathf.CeilToInt( size.X / (float) groupSize.X );
|
||||||
|
var yGroups = groupSize.Y == 0 ? 1 : Mathf.CeilToInt( size.Y / (float) groupSize.Y );
|
||||||
|
var zGroups = groupSize.Z == 0 ? 1 : Mathf.CeilToInt( size.Y / (float) groupSize.Y );
|
||||||
|
|
||||||
|
SetGroups( new Vector3I( xGroups, yGroups, zGroups ) );
|
||||||
|
}
|
||||||
|
|
||||||
public void Render()
|
public void Render()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -159,9 +180,6 @@ namespace Rokojori
|
||||||
this._view = view;
|
this._view = view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetGroups( Vector3I groups )
|
|
||||||
{
|
|
||||||
this._groups = groups;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@ namespace Rokojori
|
||||||
protected RenderingDevice _rd;
|
protected RenderingDevice _rd;
|
||||||
public RenderingDevice rd => _rd;
|
public RenderingDevice rd => _rd;
|
||||||
|
|
||||||
protected int _groupSize = 16;
|
|
||||||
protected List<RenderingObject> _cleanUps = new List<RenderingObject>();
|
protected List<RenderingObject> _cleanUps = new List<RenderingObject>();
|
||||||
protected List<string> _cleanUpInfo = new List<string>();
|
protected List<string> _cleanUpInfo = new List<string>();
|
||||||
|
|
||||||
|
@ -87,13 +87,14 @@ namespace Rokojori
|
||||||
|
|
||||||
_context.SetRenderData( renderData, sceneBuffers, sceneData );
|
_context.SetRenderData( renderData, sceneBuffers, sceneData );
|
||||||
_context.SetView( -1 );
|
_context.SetView( -1 );
|
||||||
|
|
||||||
_context.SetGroups( new Vector3I( 1, 1, 1 ) );
|
_context.SetGroups( new Vector3I( 1, 1, 1 ) );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_hasContext = true;
|
_hasContext = true;
|
||||||
var groups = ComputeGroups();
|
// var groups = ComputeGroups();
|
||||||
_context.SetGroups( groups );
|
// _context.SetGroups( groups );
|
||||||
|
|
||||||
ForAllViews();
|
ForAllViews();
|
||||||
|
|
||||||
|
@ -110,15 +111,7 @@ namespace Rokojori
|
||||||
_hasContext = false;
|
_hasContext = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual Vector3I ComputeGroups()
|
|
||||||
{
|
|
||||||
var size = context.sceneBuffers.GetInternalSize();
|
|
||||||
|
|
||||||
var xGroups = Mathf.CeilToInt( size.X / (float) _groupSize );
|
|
||||||
var yGroups = Mathf.CeilToInt( size.Y / (float) _groupSize );
|
|
||||||
|
|
||||||
return new Vector3I( xGroups, yGroups, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override void _Notification( int what )
|
public override void _Notification( int what )
|
||||||
|
|
|
@ -12,6 +12,7 @@ namespace Rokojori
|
||||||
|
|
||||||
protected RDShader _shader;
|
protected RDShader _shader;
|
||||||
protected RDPipeline _pipeline;
|
protected RDPipeline _pipeline;
|
||||||
|
protected int _groupSize = 16;
|
||||||
|
|
||||||
protected override void OnInitialize()
|
protected override void OnInitialize()
|
||||||
{
|
{
|
||||||
|
@ -52,5 +53,20 @@ namespace Rokojori
|
||||||
context.SetShaderAndPipeline( _shader, _pipeline );
|
context.SetShaderAndPipeline( _shader, _pipeline );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected RDPushConstants _constants = new RDPushConstants();
|
||||||
|
public RDPushConstants constants => _constants;
|
||||||
|
|
||||||
|
protected override void ForAllViews()
|
||||||
|
{
|
||||||
|
context.ComputeGroups( _groupSize );
|
||||||
|
|
||||||
|
SetConstants();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void SetConstants()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue