Skip to content

Commit

Permalink
Use static typing, enable anisotropic filtering on materials, tweak UI
Browse files Browse the repository at this point in the history
  • Loading branch information
Calinou committed May 22, 2024
1 parent 87b88e9 commit db81367
Show file tree
Hide file tree
Showing 7 changed files with 231 additions and 206 deletions.
68 changes: 36 additions & 32 deletions compute/post_effects/gray_scale/gray_scale.gd
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
@tool
extends RenderingEffect
class_name RenderingEffectGrayScale
extends CompositorEffect
class_name CompositorEffectGrayScale

# This is a very simple effects demo that takes our color values and writes
# back gray scale values.

func _init():
effect_callback_type = RenderingEffect.EFFECT_CALLBACK_TYPE_POST_TRANSPARENT
func _init() -> void:
effect_callback_type = CompositorEffect.EFFECT_CALLBACK_TYPE_POST_TRANSPARENT
RenderingServer.call_on_render_thread(_initialize_compute)

func _notification(what):

func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
# When this is called it should be safe to clean up our shader.
# If not we'll crash anyway because we can no longer call our _render_callback.
Expand All @@ -19,54 +20,57 @@ func _notification(what):
###############################################################################
# Everything after this point is designed to run on our rendering thread

var rd : RenderingDevice
var rd: RenderingDevice

var shader : RID
var pipeline : RID
var shader: RID
var pipeline: RID

func _initialize_compute():
func _initialize_compute() -> void:
rd = RenderingServer.get_rendering_device()
if !rd:
if not rd:
OS.alert("RenderingDevice is not available, aborting.\nCompositor effects require RenderingDevice to be available, which means you have to use the Forward+ or Mobile rendering method.")
return

# Create our shader
var shader_file = load("res://gray_scale/gray_scale.glsl")
# Create our shader.
var shader_file := load("res://gray_scale/gray_scale.glsl")
var shader_spirv: RDShaderSPIRV = shader_file.get_spirv()
shader = rd.shader_create_from_spirv(shader_spirv)
pipeline = rd.compute_pipeline_create(shader)

func _render_callback(p_effect_callback_type, p_render_data):
if rd and p_effect_callback_type == RenderingEffect.EFFECT_CALLBACK_TYPE_POST_TRANSPARENT:

func _render_callback(p_effect_callback_type: int, p_render_data: RenderData) -> void:
if rd and p_effect_callback_type == CompositorEffect.EFFECT_CALLBACK_TYPE_POST_TRANSPARENT:
# Get our render scene buffers object, this gives us access to our render buffers.
# Note that implementation differs per renderer hence the need for the cast.
var render_scene_buffers : RenderSceneBuffersRD = p_render_data.get_render_scene_buffers()
var render_scene_buffers: RenderSceneBuffersRD = p_render_data.get_render_scene_buffers()
if render_scene_buffers:
# Get our render size, this is the 3D render resolution!
var size = render_scene_buffers.get_internal_size()
if size.x == 0 and size.y == 0:
# Get our render size. This is the 3D render resolution (which can be affected by the
# `scaling_3d_scale` property), not the window size.
var size := render_scene_buffers.get_internal_size()
if size.x <= 0 and size.y <= 0:
push_error("Render size is too small.")
return

# We can use a compute shader here
var x_groups = (size.x - 1) / 8 + 1
var y_groups = (size.y - 1) / 8 + 1

# Barrier
rd.barrier(RenderingDevice.BARRIER_MASK_ALL_BARRIERS, RenderingDevice.BARRIER_MASK_COMPUTE)
# We can use a compute shader here.
@warning_ignore("integer_division")
var x_groups := (size.x - 1) / 8 + 1
@warning_ignore("integer_division")
var y_groups := (size.y - 1) / 8 + 1

# Loop through views just in case we're doing stereo rendering. No extra cost if this is mono.
var view_count = render_scene_buffers.get_view_count()
for view in range(view_count):
# Get the RID for our color image, we will be reading from and writing to it.
var input_image = render_scene_buffers.get_color_layer(view)
var view_count := render_scene_buffers.get_view_count()
for view in view_count:
# Get the RID for our color image. We will be reading from and writing to it.
var input_image: RID = render_scene_buffers.get_color_layer(view)

# Create a uniform set, this will be cached, the cache will be cleared if our viewports configuration is changed
var uniform : RDUniform = RDUniform.new()
# Create a uniform set. This will be cached: the cache will be cleared if our viewport's configuration is changed.
var uniform := RDUniform.new()
uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform.binding = 0
uniform.add_id(input_image)
var uniform_set = UniformSetCacheRD.get_cache(shader, 0, [ uniform ])
var uniform_set := UniformSetCacheRD.get_cache(shader, 0, [ uniform ])

# Run our compute shader
# Run our compute shader.
var compute_list := rd.compute_list_begin()
rd.compute_list_bind_compute_pipeline(compute_list, pipeline)
rd.compute_list_bind_uniform_set(compute_list, uniform_set, 0)
Expand Down
52 changes: 26 additions & 26 deletions compute/post_effects/main.gd
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
extends Node3D

@onready var sssr_button = $UI/MarginContainer/VBoxContainer/SSSR
@onready var gray_scale_button = $UI/MarginContainer/VBoxContainer/GrayScaleBtn

var create_depth_mips_effect : RenderingEffectCreateDepthMips
var apply_sssr_effect : RenderingEffectApplySSSR
var gray_scale_effect : RenderingEffectGrayScale

# Called when the node enters the scene tree for the first time.
func _ready():
var environment : Environment = $WorldEnvironment.environment
for effect in environment.rendering_effects:
if effect.get_script() == RenderingEffectCreateDepthMips:
var create_depth_mips_effect: CompositorEffectCreateDepthMips
var apply_sssr_effect: CompositorEffectApplySSSR
var gray_scale_effect: CompositorEffectGrayScale

var camera_x := 0.0
var camera_y := 0.0

@onready var sssr_button: Button = $UI/MarginContainer/VBoxContainer/SSSR
@onready var gray_scale_button: Button = $UI/MarginContainer/VBoxContainer/GrayScaleBtn

func _ready() -> void:
var compositor: Compositor = $WorldEnvironment.compositor
for effect in compositor.compositor_effects:
if effect.get_script() == CompositorEffectCreateDepthMips:
create_depth_mips_effect = effect
elif effect.get_script() == RenderingEffectApplySSSR:
elif effect.get_script() == CompositorEffectApplySSSR:
apply_sssr_effect = effect
elif effect.get_script() == RenderingEffectGrayScale:
elif effect.get_script() == CompositorEffectGrayScale:
gray_scale_effect = effect

if create_depth_mips_effect and apply_sssr_effect:
Expand All @@ -24,29 +26,27 @@ func _ready():
if gray_scale_effect:
gray_scale_button.button_pressed = gray_scale_effect.enabled

var cam_x = 0.0
var cam_y = 0.0

func _input(event):
func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
var mouse_event : InputEventMouseMotion = event
var mouse_event: InputEventMouseMotion = event

if mouse_event.button_mask & MOUSE_BUTTON_MASK_LEFT:
cam_x = clamp(cam_x + mouse_event.relative.y * 0.01, -PI * 0.1, PI * 0.25)
cam_y -= mouse_event.relative.x * 0.01
camera_x = clamp(camera_x + mouse_event.screen_relative.y * 0.01, -PI * 0.1, PI * 0.25)
camera_y -= mouse_event.screen_relative.x * 0.01

var b1 : Basis = Basis(Vector3.UP, cam_y)
var b2 : Basis = Basis(Vector3.LEFT, cam_x)
var b1 := Basis(Vector3.UP, camera_y)
var b2 := Basis(Vector3.LEFT, camera_x)

$Pivot.transform.basis = b1 * b2

func _on_simple_ssr_toggled(toggled_on):

func _on_simple_ssr_toggled(toggled_on: bool) -> void:
if create_depth_mips_effect and apply_sssr_effect:
create_depth_mips_effect.enabled = toggled_on
apply_sssr_effect.enabled = toggled_on

func _on_gray_scale_btn_toggled(toggled_on):

func _on_gray_scale_btn_toggled(toggled_on: bool) -> void:
if gray_scale_effect:
gray_scale_effect.enabled = toggled_on


73 changes: 43 additions & 30 deletions compute/post_effects/main.tscn
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
[gd_scene load_steps=23 format=3 uid="uid://hay7hbv1cp62"]
[gd_scene load_steps=24 format=3 uid="uid://hay7hbv1cp62"]

[ext_resource type="Script" path="res://gray_scale/gray_scale.gd" id="1_di38g"]
[ext_resource type="Script" path="res://main.gd" id="1_ekxfu"]
[ext_resource type="Script" path="res://simple_ssr/create_depth_mips.gd" id="2_0tpoa"]
[ext_resource type="Texture2D" uid="uid://bshdn70nudsun" path="res://pattern.png" id="2_d1qxb"]
[ext_resource type="Script" path="res://simple_ssr/create_depth_mips.gd" id="2_lv16x"]
[ext_resource type="Script" path="res://simple_ssr/apply_sssr.gd" id="3_ygheb"]
[ext_resource type="Script" path="res://simple_ssr/apply_sssr.gd" id="3_gyc5w"]
[ext_resource type="Script" path="res://gray_scale/gray_scale.gd" id="4_6ukm1"]
[ext_resource type="Texture2D" uid="uid://d0e66wb8yplkw" path="res://uv.jpg" id="5_ybioc"]

[sub_resource type="RenderingEffect" id="RenderingEffect_rprpc"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_ptioq"]
sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)

[sub_resource type="Sky" id="Sky_gkygq"]
sky_material = SubResource("ProceduralSkyMaterial_ptioq")

[sub_resource type="Environment" id="Environment_kx13e"]
background_mode = 2
sky = SubResource("Sky_gkygq")
tonemap_mode = 2
ssr_depth_tolerance = 3.41
glow_enabled = true

[sub_resource type="CompositorEffect" id="CompositorEffect_7wi85"]
resource_local_to_scene = false
resource_name = ""
enabled = true
Expand All @@ -16,9 +30,9 @@ access_resolved_color = false
access_resolved_depth = true
needs_motion_vectors = false
needs_normal_roughness = false
script = ExtResource("2_lv16x")
script = ExtResource("2_0tpoa")

[sub_resource type="RenderingEffect" id="RenderingEffect_sm2nk"]
[sub_resource type="CompositorEffect" id="CompositorEffect_57gju"]
resource_local_to_scene = false
resource_name = ""
enabled = true
Expand All @@ -28,39 +42,28 @@ access_resolved_depth = false
needs_motion_vectors = false
needs_normal_roughness = true
needs_separate_specular = true
script = ExtResource("3_ygheb")
script = ExtResource("3_gyc5w")
max_distance = 1.0
max_steps = 32

[sub_resource type="RenderingEffect" id="RenderingEffect_jcxua"]
[sub_resource type="CompositorEffect" id="CompositorEffect_jq1iy"]
resource_local_to_scene = false
resource_name = ""
enabled = true
effect_callback_type = 4
needs_motion_vectors = false
needs_normal_roughness = false
script = ExtResource("1_di38g")
script = ExtResource("4_6ukm1")

[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_ptioq"]
sky_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)

[sub_resource type="Sky" id="Sky_gkygq"]
sky_material = SubResource("ProceduralSkyMaterial_ptioq")

[sub_resource type="Environment" id="Environment_kx13e"]
background_mode = 2
sky = SubResource("Sky_gkygq")
tonemap_mode = 2
ssr_depth_tolerance = 3.41
glow_enabled = true
rendering_effects = Array[RenderingEffect]([SubResource("RenderingEffect_rprpc"), SubResource("RenderingEffect_sm2nk"), SubResource("RenderingEffect_jcxua")])
[sub_resource type="Compositor" id="Compositor_2i651"]
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_7wi85"), SubResource("CompositorEffect_57gju"), SubResource("CompositorEffect_jq1iy")])

[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_tvupy"]
albedo_texture = ExtResource("5_ybioc")
metallic = 0.5
roughness = 0.75
uv1_scale = Vector3(5, 5, 5)
texture_filter = 5

[sub_resource type="PlaneMesh" id="PlaneMesh_fbrjs"]
size = Vector2(20, 20)
Expand All @@ -71,6 +74,7 @@ size = Vector2(20, 20)
albedo_texture = ExtResource("2_d1qxb")
metallic = 0.78
roughness = 0.24
texture_filter = 5

[sub_resource type="SphereMesh" id="SphereMesh_lau6s"]

Expand All @@ -79,6 +83,7 @@ albedo_color = Color(1, 0.298039, 0.247059, 1)
albedo_texture = ExtResource("2_d1qxb")
metallic = 0.26
roughness = 0.59
texture_filter = 5

[sub_resource type="CylinderMesh" id="CylinderMesh_jepk0"]

Expand All @@ -87,6 +92,7 @@ albedo_color = Color(0.580392, 0.658824, 1, 1)
albedo_texture = ExtResource("2_d1qxb")
metallic = 0.86
roughness = 0.29
texture_filter = 5

[sub_resource type="BoxMesh" id="BoxMesh_syokj"]

Expand All @@ -95,16 +101,21 @@ albedo_color = Color(0.588235, 0.282353, 0.443137, 1)
albedo_texture = ExtResource("2_d1qxb")
metallic = 0.52
roughness = 0.42
texture_filter = 5

[node name="Main" type="Node3D"]
script = ExtResource("1_ekxfu")

[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_kx13e")
compositor = SubResource("Compositor_2i651")

[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.959131, 0.245052, -0.141481, -0.0849703, 0.726354, 0.682048, 0.269902, -0.642152, 0.717491, 0, 1.94732, 0)
shadow_enabled = true
directional_shadow_mode = 0
directional_shadow_fade_start = 1.0
directional_shadow_max_distance = 15.0

[node name="Pivot" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.553607, 0.779114, 0)
Expand Down Expand Up @@ -141,21 +152,23 @@ surface_material_override/0 = SubResource("StandardMaterial3D_chobt")
[node name="MarginContainer" type="MarginContainer" parent="UI"]
offset_right = 40.0
offset_bottom = 40.0
theme_override_constants/margin_left = 5
theme_override_constants/margin_top = 5
theme_override_constants/margin_right = 5
theme_override_constants/margin_bottom = 5
theme_override_constants/margin_left = 20
theme_override_constants/margin_top = 20
theme_override_constants/margin_right = 20
theme_override_constants/margin_bottom = 20

[node name="VBoxContainer" type="VBoxContainer" parent="UI/MarginContainer"]
layout_mode = 2

[node name="SSSR" type="CheckBox" parent="UI/MarginContainer/VBoxContainer"]
layout_mode = 2
text = "SSSR"
button_pressed = true
text = "Stochastic Screen-Space Reflections"

[node name="GrayScaleBtn" type="CheckBox" parent="UI/MarginContainer/VBoxContainer"]
layout_mode = 2
text = "Gray scale"
button_pressed = true
text = "Grayscale"

[connection signal="toggled" from="UI/MarginContainer/VBoxContainer/SSSR" to="." method="_on_simple_ssr_toggled"]
[connection signal="toggled" from="UI/MarginContainer/VBoxContainer/GrayScaleBtn" to="." method="_on_gray_scale_btn_toggled"]
10 changes: 9 additions & 1 deletion compute/post_effects/project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,17 @@ config_version=5

config/name="TestRenderingEffects"
run/main_scene="res://main.tscn"
config/features=PackedStringArray("4.2", "Forward Plus")
config/features=PackedStringArray("4.3", "Forward Plus")
config/icon="res://icon.svg"

[display]

window/stretch/mode="canvas_items"
window/stretch/aspect="expand"

[rendering]

textures/default_filters/anisotropic_filtering_level=4
anti_aliasing/quality/msaa_3d=2
textures/stretch/aspect="expand"
textures/stretch/mode="canvas_items"
Loading

0 comments on commit db81367

Please sign in to comment.