Browse Source

Merge pull request #743 from Calinou/add-3d-antialiasing-demo

Add a 3D antialiasing demo
Aaron Franke 3 years ago
parent
commit
044afe7976
39 changed files with 2045 additions and 0 deletions
  1. 41 0
      3d/antialiasing/README.md
  2. 100 0
      3d/antialiasing/anti_aliasing.gd
  3. 857 0
      3d/antialiasing/anti_aliasing.tscn
  4. 7 0
      3d/antialiasing/default_env.tres
  5. BIN
      3d/antialiasing/icon.png
  6. 36 0
      3d/antialiasing/icon.png.import
  7. BIN
      3d/antialiasing/polyhaven/dutch_ship_medium.bin
  8. 388 0
      3d/antialiasing/polyhaven/dutch_ship_medium_1k.gltf
  9. 28 0
      3d/antialiasing/polyhaven/dutch_ship_medium_1k.gltf.import
  10. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_arm_1k.jpg
  11. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_arm_1k.jpg.import
  12. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_diff_1k.jpg
  13. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_diff_1k.jpg.import
  14. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg
  15. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg.import
  16. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_arm_1k.jpg
  17. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_arm_1k.jpg.import
  18. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_diff_1k.jpg
  19. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_diff_1k.jpg.import
  20. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg
  21. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg.import
  22. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_arm_1k.jpg
  23. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_arm_1k.jpg.import
  24. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_diff_1k.jpg
  25. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_diff_1k.jpg.import
  26. BIN
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg
  27. 36 0
      3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg.import
  28. 32 0
      3d/antialiasing/project.godot
  29. 0 0
      3d/antialiasing/screenshots/.gdignore
  30. BIN
      3d/antialiasing/screenshots/3d_anti_aliasing.png
  31. 7 0
      3d/antialiasing/textures/checker.LICENSE.md
  32. BIN
      3d/antialiasing/textures/checker.png
  33. 36 0
      3d/antialiasing/textures/checker.png.import
  34. 7 0
      3d/antialiasing/textures/paint.LICENSE.md
  35. BIN
      3d/antialiasing/textures/paint.png
  36. 34 0
      3d/antialiasing/textures/paint.png.import
  37. BIN
      3d/antialiasing/textures/paint_normal.png
  38. 34 0
      3d/antialiasing/textures/paint_normal.png.import
  39. 114 0
      3d/antialiasing/thin_lines.tscn

+ 41 - 0
3d/antialiasing/README.md

@@ -0,0 +1,41 @@
+# 3D Anti-Aliasing
+
+This project showcases the various 3D antialiasing techniques supported by Godot.
+
+- **Multisample antialiasing (MSAA):** High quality, high performance cost.
+  Does not blur the image.
+  - Does not affect shader-induced aliasing (such as specular aliasing) or alpha
+	scissor materials, so these will remain aliased.
+- **Fast approximate antialiasing (FXAA):** Medium quality, low performance cost.
+  Slightly blurs the image.
+- **Temporal antialiasing (TAA):** High-quality, low performance cost. Slightly
+  blurs the image (but less so than FXAA).
+  - Antialiasing quality is worse on fast-moving objects than other methods,
+	especially at lower framerates since the TAA won't have enough time to
+	converge on those objects.
+  - Can introduce ghosting artifacts on moving objects, especially if motion
+	vectors are not correctly generated from a given material shader.
+- **Supersampling (SSAA):** The highest-quality technique, but also the most
+  expensive. Does not blur the image.
+  - 200% resolution scale is equivalent to 4× SSAA, as each dimension is
+	doubled. For example, if running in a 1920×1080 window at 200% render scale,
+	the 3D framebuffer will be 3840×2160.
+  - SSAA can be used together with FXAA or TAA to counter the blurring added by
+	those algorithms, while further improving antialiasing quality.
+
+Godot allows using multiple antialiasing techniques at the same time. This can
+be useful to obtain the best possible quality, or to find a better performance
+tradeoff.
+
+Language: GDScript
+
+Renderer: Vulkan Clustered
+
+## Screenshots
+
+![Screenshot](screenshots/3d_anti_aliasing.png)
+
+## Licenses
+
+Files in the `polyhaven/` folder are downloaded from <https://polyhaven.com/a/dutch_ship_medium>
+and are licensed under CC0 1.0 Universal.

+ 100 - 0
3d/antialiasing/anti_aliasing.gd

@@ -0,0 +1,100 @@
+extends Node
+
+const ROT_SPEED = 0.003
+const ZOOM_SPEED = 0.125
+const MAIN_BUTTONS = MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT | MOUSE_BUTTON_MASK_MIDDLE
+
+var tester_index = 0
+var rot_x = -TAU / 16  # This must be kept in sync with RotationX.
+var rot_y = TAU / 8  # This must be kept in sync with CameraHolder.
+var camera_distance = 2.0
+var base_height = ProjectSettings.get_setting("display/window/size/viewport_height")
+
+@onready var testers = $Testers
+@onready var camera_holder = $CameraHolder # Has a position and rotates on Y.
+@onready var rotation_x = $CameraHolder/RotationX
+@onready var camera = $CameraHolder/RotationX/Camera3D
+
+
+func _ready():
+	camera_holder.transform.basis = Basis.from_euler(Vector3(0, rot_y, 0))
+	rotation_x.transform.basis = Basis.from_euler(Vector3(rot_x, 0, 0))
+	update_gui()
+
+
+func _unhandled_input(event):
+	if event.is_action_pressed("ui_left"):
+		_on_previous_pressed()
+	if event.is_action_pressed("ui_right"):
+		_on_next_pressed()
+
+	if event is InputEventMouseButton:
+		if event.button_index == MOUSE_BUTTON_WHEEL_UP:
+			camera_distance -= ZOOM_SPEED
+		if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
+			camera_distance += ZOOM_SPEED
+		camera_distance = clamp(camera_distance, 1.5, 6)
+
+	if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
+		# Compensate motion speed to be resolution-independent (based on the window height).
+		var relative_motion = event.relative * DisplayServer.window_get_size().y / base_height
+		rot_y -= relative_motion.x * ROT_SPEED
+		rot_x -= relative_motion.y * ROT_SPEED
+		rot_x = clamp(rot_x, -1.57, 0)
+		camera_holder.transform.basis = Basis.from_euler(Vector3(0, rot_y, 0))
+		rotation_x.transform.basis = Basis.from_euler(Vector3(rot_x, 0, 0))
+
+
+func _process(delta):
+	var current_tester = testers.get_child(tester_index)
+	# This code assumes CameraHolder's X and Y coordinates are already correct.
+	var current_position = camera_holder.global_transform.origin.z
+	var target_position = current_tester.global_transform.origin.z
+	camera_holder.global_transform.origin.z = lerp(current_position, target_position, 3 * delta)
+	camera.position.z = lerp(camera.position.z, camera_distance, 10 * delta)
+
+
+func _on_previous_pressed():
+	tester_index = max(0, tester_index - 1)
+	update_gui()
+
+
+func _on_next_pressed():
+	tester_index = min(tester_index + 1, testers.get_child_count() - 1)
+	update_gui()
+
+
+func update_gui():
+	$TestName.text = str(testers.get_child(tester_index).name).capitalize()
+	$Previous.disabled = tester_index == 0
+	$Next.disabled = tester_index == testers.get_child_count() - 1
+
+
+func _on_fxaa_toggled(button_pressed):
+	get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA if button_pressed else Viewport.SCREEN_SPACE_AA_DISABLED
+
+
+func _on_temporal_antialiasing_toggled(button_pressed):
+	get_viewport().use_taa = button_pressed
+
+
+func _on_msaa_item_selected(index):
+	get_viewport().msaa = index
+
+
+func _on_render_scale_item_selected(index):
+	match index:
+		0:
+			get_viewport().scaling_3d_scale = 0.5
+		1:
+			get_viewport().scaling_3d_scale = 0.75
+		2:
+			get_viewport().scaling_3d_scale = 1.0
+		3:
+			get_viewport().scaling_3d_scale = 1.25
+		4:
+			get_viewport().scaling_3d_scale = 1.5
+		5:
+			get_viewport().scaling_3d_scale = 1.75
+		6:
+			get_viewport().scaling_3d_scale = 2.0

+ 857 - 0
3d/antialiasing/anti_aliasing.tscn

@@ -0,0 +1,857 @@
+[gd_scene load_steps=48 format=3 uid="uid://clyxqp0e6qemi"]
+
+[ext_resource type="Texture2D" uid="uid://ccgkupemr6e1q" path="res://textures/paint.png" id="3_2nulf"]
+[ext_resource type="PackedScene" uid="uid://daokc0jvx7nkw" path="res://thin_lines.tscn" id="3_5ehjl"]
+[ext_resource type="PackedScene" uid="uid://sxx5ow26t0c3" path="res://polyhaven/dutch_ship_medium_1k.gltf" id="3_fa2bl"]
+[ext_resource type="Texture2D" uid="uid://bm6eht0bqttpo" path="res://textures/paint_normal.png" id="4_fdfpv"]
+[ext_resource type="Texture2D" uid="uid://chjqieyps5n5r" path="res://textures/checker.png" id="14"]
+[ext_resource type="Script" path="res://anti_aliasing.gd" id="18"]
+
+[sub_resource type="ProceduralSkyMaterial" id="9"]
+
+[sub_resource type="Sky" id="10"]
+sky_material = SubResource("9")
+
+[sub_resource type="Environment" id="11"]
+background_mode = 2
+sky = SubResource("10")
+
+[sub_resource type="Animation" id="Animation_qdnt6"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Testers/MovingObject/MeshInstance3D:position")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 0.5, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Testers/RotatingObject/MeshInstance3D:rotation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 0, 0)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Testers/ScalingObject/MeshInstance3D:scale")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 0, 0)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Testers/MovingCPUParticles/CPUParticles3D:position")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 0.5, 0)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Testers/MovingDecal/Decal:position")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(1, 1, 1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Testers/MovingDecal/Decal:rotation")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0.18405, -2.33886, 0.187249)]
+}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Testers/ScrollingUVAnimation/MeshInstance3D:surface_material_override/0:uv1_offset")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 0, 0)]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("Testers/MovingGPUParticles/GPUParticles3D:position")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Vector3(0, 1.2, 0)]
+}
+
+[sub_resource type="Animation" id="12"]
+resource_name = "move"
+length = 4.0
+loop_mode = 1
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Testers/MovingObject/MeshInstance3D:position")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(-2, -2),
+"update": 0,
+"values": [Vector3(0, 0.5, 0), Vector3(0, 2.5, 0)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Testers/RotatingObject/MeshInstance3D:rotation")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 4),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(0, 0, 0), Vector3(0, 18.8496, 0)]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Testers/ScalingObject/MeshInstance3D:scale")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(0, 0, 0), Vector3(1, 1, 3)]
+}
+tracks/3/type = "value"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Testers/MovingCPUParticles/CPUParticles3D:position")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(-2, -2),
+"update": 0,
+"values": [Vector3(0, 0.2, 0), Vector3(0, 2.2, 0)]
+}
+tracks/4/type = "value"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Testers/MovingDecal/Decal:position")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(-2, -2),
+"update": 0,
+"values": [Vector3(1, 1, 1), Vector3(-1, 1, -1)]
+}
+tracks/5/type = "value"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Testers/MovingDecal/Decal:rotation")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(-2, -2),
+"update": 0,
+"values": [Vector3(0, 0, 0), Vector3(0.18405, -2.33886, 0.187249)]
+}
+tracks/6/type = "value"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Testers/ScrollingUVAnimation/MeshInstance3D:surface_material_override/0:uv1_offset")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"times": PackedFloat32Array(0, 4),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Vector3(0, 0, 0), Vector3(3, 0, 0)]
+}
+tracks/7/type = "value"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("Testers/MovingGPUParticles/GPUParticles3D:position")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"times": PackedFloat32Array(0, 2),
+"transitions": PackedFloat32Array(-2, -2),
+"update": 0,
+"values": [Vector3(0, 1.2, 0), Vector3(0, 4.2, 0)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_ecfcr"]
+_data = {
+"RESET": SubResource("Animation_qdnt6"),
+"move": SubResource("12")
+}
+
+[sub_resource type="StandardMaterial3D" id="13"]
+diffuse_mode = 1
+albedo_texture = ExtResource("14")
+uv1_scale = Vector3(32, 32, 1)
+texture_filter = 5
+
+[sub_resource type="PlaneMesh" id="14"]
+material = SubResource("13")
+size = Vector2(128, 128)
+
+[sub_resource type="BoxMesh" id="BoxMesh_gwe28"]
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_fiqc5"]
+fractal_octaves = 9
+fractal_gain = 1.0
+
+[sub_resource type="NoiseTexture" id="NoiseTexture_bgiac"]
+seamless = true
+noise = SubResource("FastNoiseLite_fiqc5")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_x42ya"]
+albedo_color = Color(1.2, 1, 0.7, 1)
+albedo_texture = SubResource("NoiseTexture_bgiac")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 5
+
+[sub_resource type="NoiseTexture" id="NoiseTexture_7yxqs"]
+width = 32
+height = 32
+seamless = true
+noise = SubResource("FastNoiseLite_fiqc5")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6yfdy"]
+albedo_texture = SubResource("NoiseTexture_7yxqs")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 4
+
+[sub_resource type="Gradient" id="Gradient_ekf3m"]
+offsets = PackedFloat32Array(0, 0.298851, 0.609195, 0.781609, 0.873563, 1)
+colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1, 1, 0.133693, 0.238417, 0.655738, 1, 0.4, 0.47451, 0, 1, 0.364109, 0.476658, 1, 1, 1, 1, 0)
+
+[sub_resource type="NoiseTexture" id="NoiseTexture_uv2tn"]
+seamless = true
+color_ramp = SubResource("Gradient_ekf3m")
+noise = SubResource("FastNoiseLite_fiqc5")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qcf1j"]
+transparency = 1
+cull_mode = 2
+albedo_color = Color(1.2, 1, 0.7, 1)
+albedo_texture = SubResource("NoiseTexture_uv2tn")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 5
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xbqpl"]
+transparency = 2
+alpha_scissor_threshold = 0.72
+alpha_antialiasing_mode = 0
+cull_mode = 2
+albedo_color = Color(1.2, 1, 0.7, 1)
+albedo_texture = SubResource("NoiseTexture_uv2tn")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 5
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mjkwh"]
+transparency = 3
+alpha_hash_scale = 1.0
+alpha_antialiasing_mode = 0
+cull_mode = 2
+albedo_color = Color(1.2, 1, 0.7, 1)
+albedo_texture = SubResource("NoiseTexture_uv2tn")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 5
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f4l4p"]
+transparency = 4
+cull_mode = 2
+albedo_color = Color(1.2, 1, 0.7, 1)
+albedo_texture = SubResource("NoiseTexture_uv2tn")
+uv1_scale = Vector3(3, 2, 1)
+texture_filter = 5
+
+[sub_resource type="SphereMesh" id="SphereMesh_kfkna"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rfedc"]
+transparency = 2
+alpha_scissor_threshold = 0.05
+alpha_antialiasing_mode = 0
+use_point_size = true
+point_size = 3.2
+
+[sub_resource type="Gradient" id="Gradient_3dg7h"]
+interpolation_mode = 2
+offsets = PackedFloat32Array(0, 0.94964)
+colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 0)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_42opb"]
+gradient = SubResource("Gradient_3dg7h")
+fill = 1
+fill_from = Vector2(0.5, 0.5)
+fill_to = Vector2(0.49, 0)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_layy4"]
+transparency = 1
+shading_mode = 0
+vertex_color_use_as_albedo = true
+albedo_texture = SubResource("GradientTexture2D_42opb")
+billboard_mode = 3
+particles_anim_h_frames = 1
+particles_anim_v_frames = 1
+particles_anim_loop = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_imrxg"]
+material = SubResource("StandardMaterial3D_layy4")
+
+[sub_resource type="Curve" id="Curve_v0n7y"]
+_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
+point_count = 2
+
+[sub_resource type="Gradient" id="Gradient_e7gyf"]
+offsets = PackedFloat32Array(0, 0.0946746, 0.5, 0.804734)
+colors = PackedColorArray(0, 0.14902, 1, 0, 0.0627836, 0.243372, 0.995875, 1, 0.568541, 1, 0.962647, 1, 1, 1, 1, 1)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r4xcu"]
+albedo_color = Color(0.521569, 1, 0.776471, 1)
+
+[sub_resource type="BoxMesh" id="BoxMesh_88317"]
+material = SubResource("StandardMaterial3D_r4xcu")
+size = Vector3(0.1, 0.1, 0.1)
+
+[sub_resource type="Curve" id="Curve_sutnd"]
+_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
+point_count = 2
+
+[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_ft0gs"]
+emission_shape = 6
+emission_ring_axis = Vector3(0, 1, 0)
+emission_ring_height = 0.0
+emission_ring_radius = 0.25
+emission_ring_inner_radius = 0.25
+radial_accel_min = 2.0
+radial_accel_max = 2.0
+collision_enabled = true
+collision_friction = 0.1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1dgwn"]
+albedo_color = Color(0.545098, 0.545098, 0.545098, 1)
+
+[sub_resource type="SphereMesh" id="SphereMesh_v4x6x"]
+material = SubResource("StandardMaterial3D_1dgwn")
+radius = 1.0
+height = 2.0
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_5qy8k"]
+height = 1.0
+radial_segments = 6
+rings = 1
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_53dqy"]
+albedo_color = Color(0.946182, 1.18208, 1.2, 1)
+albedo_texture = SubResource("NoiseTexture_bgiac")
+uv1_scale = Vector3(2, 2, 1)
+texture_filter = 5
+
+[sub_resource type="Shader" id="Shader_rejcs"]
+code = "// NOTE: Shader automatically converted from Godot Engine 4.0.alpha's StandardMaterial3D.
+
+shader_type spatial;
+render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
+uniform vec4 albedo : source_color;
+uniform sampler2D texture_albedo : source_color,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform float point_size : hint_range(0,128);
+uniform float roughness : hint_range(0,1);
+uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform vec4 metallic_texture_channel;
+uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform float specular;
+uniform float metallic;
+uniform vec3 uv1_scale;
+uniform vec3 uv1_offset;
+uniform vec3 uv2_scale;
+uniform vec3 uv2_offset;
+
+void vertex() {
+	// Scroll the texture over time.
+	UV = UV*uv1_scale.xy+uv1_offset.xy + vec2(mod(TIME, 1.0), 0.0);
+}
+
+void fragment() {
+	vec2 base_uv = UV;
+	vec4 albedo_tex = texture(texture_albedo,base_uv);
+	ALBEDO = albedo.rgb * albedo_tex.rgb;
+	float metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel);
+	METALLIC = metallic_tex * metallic;
+	vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
+	float roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel);
+	ROUGHNESS = roughness_tex * roughness;
+	SPECULAR = specular;
+}
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ltvd2"]
+render_priority = 0
+shader = SubResource("Shader_rejcs")
+shader_param/albedo = Color(1.2, 0.915333, 0.997134, 1)
+shader_param/metallic = 0.0
+shader_param/metallic_texture_channel = Plane(1, 0, 0, 0)
+shader_param/point_size = 1.0
+shader_param/roughness = 1.0
+shader_param/specular = 0.5
+shader_param/texture_albedo = SubResource("NoiseTexture_bgiac")
+shader_param/uv1_offset = Vector3(0, 0, 0)
+shader_param/uv1_scale = Vector3(2, 2, 1)
+shader_param/uv2_offset = Vector3(0, 0, 0)
+shader_param/uv2_scale = Vector3(1, 1, 1)
+
+[sub_resource type="CylinderMesh" id="CylinderMesh_oopii"]
+height = 1.0
+radial_segments = 18
+rings = 1
+
+[sub_resource type="Shader" id="Shader_ovufm"]
+code = "// NOTE: Shader automatically converted from Godot Engine 4.0.alpha's StandardMaterial3D.
+
+shader_type spatial;
+render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx;
+uniform vec4 albedo : source_color;
+uniform sampler2D texture_albedo : source_color,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform float point_size : hint_range(0,128);
+uniform float roughness : hint_range(0,1);
+uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform vec4 metallic_texture_channel;
+uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap_anisotropic,repeat_enable;
+uniform float specular;
+uniform float metallic;
+uniform vec3 uv1_scale;
+uniform vec3 uv1_offset;
+uniform vec3 uv2_scale;
+uniform vec3 uv2_offset;
+
+float rand(vec2 co){
+    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
+}
+
+void vertex() {
+	// Move vertices randomly over time.
+	VERTEX.y += 0.25 + sin(TIME * 2.0) * rand(vec2(VERTEX.xz)) * 0.5;
+}
+
+void fragment() {
+	vec2 base_uv = UV;
+	vec4 albedo_tex = texture(texture_albedo,base_uv);
+	ALBEDO = albedo.rgb * albedo_tex.rgb;
+	float metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel);
+	METALLIC = metallic_tex * metallic;
+	vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
+	float roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel);
+	ROUGHNESS = roughness_tex * roughness;
+	SPECULAR = specular;
+}
+"
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_fbaw5"]
+render_priority = 0
+shader = SubResource("Shader_ovufm")
+shader_param/albedo = Color(1.2, 1.16365, 0.85123, 1)
+shader_param/metallic = 0.0
+shader_param/metallic_texture_channel = Plane(1, 0, 0, 0)
+shader_param/point_size = 1.0
+shader_param/roughness = 1.0
+shader_param/specular = 0.5
+shader_param/texture_albedo = SubResource("NoiseTexture_bgiac")
+shader_param/uv1_offset = Vector3(0, 0, 0)
+shader_param/uv1_scale = Vector3(2, 2, 1)
+shader_param/uv2_offset = Vector3(0, 0, 0)
+shader_param/uv2_scale = Vector3(1, 1, 1)
+
+[node name="AntiAliasingTestScene" type="WorldEnvironment"]
+environment = SubResource("11")
+script = ExtResource("18")
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "move"
+libraries = {
+"": SubResource("AnimationLibrary_ecfcr")
+}
+
+[node name="Plane" type="MeshInstance3D" parent="."]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -34)
+layers = 2
+mesh = SubResource("14")
+
+[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
+transform = Transform3D(0.909487, -0.23874, 0.340349, 0, 0.818672, 0.574262, -0.415733, -0.522284, 0.744571, 3.9506, 3.39961, 3.54442)
+shadow_enabled = true
+shadow_normal_bias = 1.5
+shadow_blur = 1.5
+directional_shadow_mode = 0
+directional_shadow_fade_start = 1.0
+directional_shadow_max_distance = 25.0
+
+[node name="CameraHolder" type="Node3D" parent="."]
+transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0.125, 0)
+
+[node name="RotationX" type="Node3D" parent="CameraHolder"]
+
+[node name="Camera3D" type="Camera3D" parent="CameraHolder/RotationX"]
+fov = 70.0
+
+[node name="Testers" type="Node3D" parent="."]
+
+[node name="StaticObject" type="Node3D" parent="Testers"]
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/StaticObject"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_x42ya")
+
+[node name="MeshInstance3D2" type="MeshInstance3D" parent="Testers/StaticObject"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0.5, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_6yfdy")
+
+[node name="ThinLines" parent="Testers" instance=ExtResource("3_5ehjl")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4)
+
+[node name="TransparencyAlphaBlend" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -8)
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="Testers/TransparencyAlphaBlend"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.501, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_qcf1j")
+
+[node name="TransparencyAlphaScissor" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -12)
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="Testers/TransparencyAlphaScissor"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.501, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_xbqpl")
+
+[node name="TransparencyAlphaHash" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16)
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="Testers/TransparencyAlphaHash"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.501, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_mjkwh")
+
+[node name="TransparencyDepthPrepass" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -20)
+
+[node name="MeshInstance3D3" type="MeshInstance3D" parent="Testers/TransparencyDepthPrepass"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.501, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_f4l4p")
+
+[node name="ComplexObject" parent="Testers" instance=ExtResource("3_fa2bl")]
+transform = Transform3D(0.2, 0, 0, 0, 0.2, 0, 0, 0, 0.2, 0, 0.35, -24)
+
+[node name="PointRendering" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -28)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/PointRendering"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("SphereMesh_kfkna")
+surface_material_override/0 = SubResource("StandardMaterial3D_rfedc")
+
+[node name="MovingObject" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -32)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/MovingObject"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_x42ya")
+
+[node name="RotatingObject" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -36)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/RotatingObject"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_x42ya")
+
+[node name="ScalingObject" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -40)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/ScalingObject"]
+transform = Transform3D(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0)
+mesh = SubResource("BoxMesh_gwe28")
+surface_material_override/0 = SubResource("StandardMaterial3D_x42ya")
+
+[node name="StaticCPUParticles" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -44)
+
+[node name="CPUParticles3D" type="CPUParticles3D" parent="Testers/StaticCPUParticles"]
+amount = 100
+draw_order = 1
+mesh = SubResource("QuadMesh_imrxg")
+direction = Vector3(0, 1, 0)
+spread = 10.0
+initial_velocity_min = 5.0
+initial_velocity_max = 5.0
+scale_amount_min = 0.25
+scale_amount_max = 0.25
+scale_amount_curve = SubResource("Curve_v0n7y")
+color_ramp = SubResource("Gradient_e7gyf")
+
+[node name="CPUParticles3D2" type="CPUParticles3D" parent="Testers/StaticCPUParticles/CPUParticles3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0.2, 0)
+amount = 20
+mesh = SubResource("BoxMesh_88317")
+spread = 180.0
+gravity = Vector3(0, 0, 0)
+initial_velocity_min = 2.5
+initial_velocity_max = 2.5
+radial_accel_min = -5.0
+radial_accel_max = -5.0
+scale_amount_min = 0.25
+scale_amount_max = 2.5
+scale_amount_curve = SubResource("Curve_sutnd")
+
+[node name="MovingCPUParticles" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -48)
+
+[node name="CPUParticles3D" type="CPUParticles3D" parent="Testers/MovingCPUParticles"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+amount = 100
+lifetime = 0.5
+local_coords = false
+draw_order = 1
+mesh = SubResource("QuadMesh_imrxg")
+direction = Vector3(0, 1, 0)
+spread = 10.0
+initial_velocity_min = 2.0
+initial_velocity_max = 2.0
+tangential_accel_min = 6.0
+tangential_accel_max = 40.0
+scale_amount_min = 0.25
+scale_amount_max = 0.25
+scale_amount_curve = SubResource("Curve_v0n7y")
+color = Color(6, 2, 6, 1)
+color_ramp = SubResource("Gradient_e7gyf")
+
+[node name="CPUParticles3D" type="CPUParticles3D" parent="Testers/MovingCPUParticles/CPUParticles3D"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0)
+amount = 20
+local_coords = false
+mesh = SubResource("BoxMesh_88317")
+spread = 180.0
+gravity = Vector3(0, 0, 0)
+initial_velocity_min = 2.5
+initial_velocity_max = 2.5
+scale_amount_curve = SubResource("Curve_sutnd")
+
+[node name="StaticGPUParticles" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -52)
+
+[node name="GPUParticles3D" type="GPUParticles3D" parent="Testers/StaticGPUParticles"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0)
+amount = 50
+lifetime = 2.0
+fixed_fps = 0
+collision_base_size = 0.05
+visibility_aabb = AABB(-1.63511, -1.25001, -1.31512, 3.0892, 2.15487, 2.91765)
+process_material = SubResource("ParticlesMaterial_ft0gs")
+draw_pass_1 = SubResource("BoxMesh_88317")
+
+[node name="GPUParticlesCollisionBox3D" type="GPUParticlesCollisionBox3D" parent="Testers/StaticGPUParticles"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
+extents = Vector3(2, 1, 2)
+
+[node name="MovingGPUParticles" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -56)
+
+[node name="GPUParticles3D" type="GPUParticles3D" parent="Testers/MovingGPUParticles"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0)
+extra_cull_margin = 3.0
+amount = 50
+lifetime = 2.0
+fixed_fps = 0
+collision_base_size = 0.05
+visibility_aabb = AABB(-1.50087, -1.25001, -1.4745, 3.19423, 2.13905, 3.02308)
+local_coords = false
+process_material = SubResource("ParticlesMaterial_ft0gs")
+draw_pass_1 = SubResource("BoxMesh_88317")
+
+[node name="GPUParticlesCollisionBox3D2" type="GPUParticlesCollisionBox3D" parent="Testers/MovingGPUParticles"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0)
+extents = Vector3(2, 1, 2)
+
+[node name="MovingDecal" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -60)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/MovingDecal"]
+mesh = SubResource("SphereMesh_v4x6x")
+
+[node name="Decal" type="Decal" parent="Testers/MovingDecal"]
+transform = Transform3D(-0.707104, -1.01328e-06, -0.707109, 0.183013, 0.965926, -0.183013, 0.683015, -0.258819, -0.68301, 1, 1, 1)
+texture_albedo = ExtResource("3_2nulf")
+texture_normal = ExtResource("4_fdfpv")
+
+[node name="ScrollingUVAnimation" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -64)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/ScrollingUVAnimation"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("CylinderMesh_5qy8k")
+surface_material_override/0 = SubResource("StandardMaterial3D_53dqy")
+
+[node name="ScrollingUVCustomShader" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -68)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/ScrollingUVCustomShader"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("CylinderMesh_5qy8k")
+surface_material_override/0 = SubResource("ShaderMaterial_ltvd2")
+
+[node name="CustomShaderVertexMovement" type="Node3D" parent="Testers"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -72)
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="Testers/CustomShaderVertexMovement"]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
+mesh = SubResource("CylinderMesh_oopii")
+surface_material_override/0 = SubResource("ShaderMaterial_fbaw5")
+
+[node name="TestName" type="Label" parent="."]
+anchor_left = 0.5
+anchor_top = 1.0
+anchor_right = 0.5
+anchor_bottom = 1.0
+offset_left = -192.0
+offset_top = -58.0
+offset_right = 192.0
+offset_bottom = -24.0
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 5
+theme_override_font_sizes/font_size = 24
+horizontal_alignment = 1
+
+[node name="Previous" type="Button" parent="."]
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 24.0
+offset_top = -55.0
+offset_right = 135.0
+offset_bottom = -24.0
+text = "«  Previous"
+
+[node name="Next" type="Button" parent="."]
+anchor_left = 1.0
+anchor_top = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -107.0
+offset_top = -55.0
+offset_right = -24.0
+offset_bottom = -24.0
+text = "Next  »"
+
+[node name="Antialiasing" type="VBoxContainer" parent="."]
+offset_left = 24.0
+offset_top = 24.0
+offset_right = 210.0
+offset_bottom = 55.0
+theme_override_constants/separation = 10
+
+[node name="Label" type="Label" parent="Antialiasing"]
+offset_right = 265.0
+offset_bottom = 26.0
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+text = "Antialiasing Options:"
+
+[node name="FXAA" type="CheckButton" parent="Antialiasing"]
+offset_top = 36.0
+offset_right = 265.0
+offset_bottom = 67.0
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+text = "FXAA (Fast)"
+
+[node name="TemporalAntialiasing" type="CheckButton" parent="Antialiasing"]
+offset_top = 77.0
+offset_right = 265.0
+offset_bottom = 108.0
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_constants/outline_size = 3
+text = "Temporal antialiasing (Fast)"
+
+[node name="MSAA" type="OptionButton" parent="Antialiasing"]
+offset_top = 118.0
+offset_right = 265.0
+offset_bottom = 149.0
+item_count = 4
+selected = 0
+popup/item_0/text = "No MSAA (Fastest)"
+popup/item_0/id = 0
+popup/item_1/text = "2× MSAA (Average)"
+popup/item_1/id = 1
+popup/item_2/text = "4× MSAA (Slow)"
+popup/item_2/id = 2
+popup/item_3/text = "8× MSAA (Slowest)"
+popup/item_3/id = 3
+
+[node name="RenderScale" type="OptionButton" parent="Antialiasing"]
+offset_top = 159.0
+offset_right = 265.0
+offset_bottom = 190.0
+item_count = 7
+selected = 2
+popup/item_0/text = "50% Render Scale (Fastest)"
+popup/item_0/id = 0
+popup/item_1/text = "75% Render Scale (Fast)"
+popup/item_1/id = 1
+popup/item_2/text = "100% Render Scale (Average)"
+popup/item_2/id = 2
+popup/item_3/text = "125% Render Scale (1.56× SSAA, Slow)"
+popup/item_3/id = 3
+popup/item_4/text = "150% Render Scale (2.25× SSAA, Slower)"
+popup/item_4/id = 4
+popup/item_5/text = "175% Render Scale (3.06× SSAA, Very Slow)"
+popup/item_5/id = 5
+popup/item_6/text = "200% Render Scale (4× SSAA, Slowest)"
+popup/item_6/id = 6
+
+[connection signal="pressed" from="Previous" to="." method="_on_previous_pressed"]
+[connection signal="pressed" from="Next" to="." method="_on_next_pressed"]
+[connection signal="toggled" from="Antialiasing/FXAA" to="." method="_on_fxaa_toggled"]
+[connection signal="toggled" from="Antialiasing/TemporalAntialiasing" to="." method="_on_temporal_antialiasing_toggled"]
+[connection signal="item_selected" from="Antialiasing/MSAA" to="." method="_on_msaa_item_selected"]
+[connection signal="item_selected" from="Antialiasing/RenderScale" to="." method="_on_render_scale_item_selected"]

+ 7 - 0
3d/antialiasing/default_env.tres

@@ -0,0 +1,7 @@
+[gd_resource type="Environment" load_steps=2 format=2]
+
+[sub_resource type="Sky" id=1]
+
+[resource]
+background_mode = 2
+sky = SubResource( 1 )

BIN
3d/antialiasing/icon.png


+ 36 - 0
3d/antialiasing/icon.png.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8c1xtc7yj6s5"
+path.s3tc="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.ctex"
+path.etc2="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.ctex", "res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/dutch_ship_medium.bin


+ 388 - 0
3d/antialiasing/polyhaven/dutch_ship_medium_1k.gltf

@@ -0,0 +1,388 @@
+{
+  "asset": {
+    "generator": "Khronos glTF Blender I/O v1.7.33",
+    "version": "2.0"
+  },
+  "scene": 0,
+  "scenes": [
+    {
+      "name": "dutch_ship_medium",
+      "nodes": [
+        0,
+        1,
+        2
+      ]
+    }
+  ],
+  "nodes": [
+    {
+      "mesh": 0,
+      "name": "dutch_ship_medium_rigging"
+    },
+    {
+      "mesh": 1,
+      "name": "dutch_ship_medium_hull"
+    },
+    {
+      "mesh": 2,
+      "name": "dutch_ship_medium_sails"
+    }
+  ],
+  "materials": [
+    {
+      "doubleSided": true,
+      "name": "dutch_ship_medium_rigging",
+      "normalTexture": {
+        "index": 0
+      },
+      "pbrMetallicRoughness": {
+        "baseColorTexture": {
+          "index": 1
+        },
+        "metallicRoughnessTexture": {
+          "index": 2
+        }
+      }
+    },
+    {
+      "doubleSided": true,
+      "name": "dutch_ship_medium_hull",
+      "normalTexture": {
+        "index": 3
+      },
+      "pbrMetallicRoughness": {
+        "baseColorTexture": {
+          "index": 4
+        },
+        "metallicRoughnessTexture": {
+          "index": 5
+        }
+      }
+    },
+    {
+      "alphaCutoff": 0.5,
+      "alphaMode": "MASK",
+      "doubleSided": true,
+      "name": "dutch_ship_medium_sails",
+      "normalTexture": {
+        "index": 6
+      },
+      "pbrMetallicRoughness": {
+        "baseColorTexture": {
+          "index": 7
+        },
+        "metallicFactor": 0,
+        "metallicRoughnessTexture": {
+          "index": 8
+        }
+      }
+    }
+  ],
+  "meshes": [
+    {
+      "name": "x-Boats-Dutch-medium-rigging-joined",
+      "primitives": [
+        {
+          "attributes": {
+            "POSITION": 0,
+            "NORMAL": 1,
+            "TEXCOORD_0": 2
+          },
+          "indices": 3,
+          "material": 0
+        }
+      ]
+    },
+    {
+      "name": "x-Boats-Dutch-medium-baseB-joined",
+      "primitives": [
+        {
+          "attributes": {
+            "POSITION": 4,
+            "NORMAL": 5,
+            "TEXCOORD_0": 6
+          },
+          "indices": 7,
+          "material": 1
+        }
+      ]
+    },
+    {
+      "name": "Plane.072",
+      "primitives": [
+        {
+          "attributes": {
+            "POSITION": 8,
+            "NORMAL": 9,
+            "TEXCOORD_0": 10
+          },
+          "indices": 11,
+          "material": 2
+        }
+      ]
+    }
+  ],
+  "textures": [
+    {
+      "sampler": 0,
+      "source": 0
+    },
+    {
+      "sampler": 0,
+      "source": 1
+    },
+    {
+      "sampler": 0,
+      "source": 2
+    },
+    {
+      "sampler": 0,
+      "source": 3
+    },
+    {
+      "sampler": 0,
+      "source": 4
+    },
+    {
+      "sampler": 0,
+      "source": 5
+    },
+    {
+      "sampler": 0,
+      "source": 6
+    },
+    {
+      "sampler": 0,
+      "source": 7
+    },
+    {
+      "sampler": 0,
+      "source": 8
+    }
+  ],
+  "images": [
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_rigging_nor_gl",
+      "uri": "textures/dutch_ship_medium_rigging_nor_gl_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_rigging_diff",
+      "uri": "textures/dutch_ship_medium_rigging_diff_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_rigging_metal-dutch_ship_medium_rigging_rough",
+      "uri": "textures/dutch_ship_medium_rigging_arm_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_hull_nor_gl",
+      "uri": "textures/dutch_ship_medium_hull_nor_gl_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_hull_diff",
+      "uri": "textures/dutch_ship_medium_hull_diff_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_hull_metal-dutch_ship_medium_hull_rough",
+      "uri": "textures/dutch_ship_medium_hull_arm_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_sails_nor_gl",
+      "uri": "textures/dutch_ship_medium_sails_nor_gl_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_sails_diff-dutch_ship_medium_sails_alpha",
+      "uri": "textures/dutch_ship_medium_sails_diff_1k.jpg"
+    },
+    {
+      "mimeType": "image/jpeg",
+      "name": "dutch_ship_medium_sails_rough",
+      "uri": "textures/dutch_ship_medium_sails_arm_1k.jpg"
+    }
+  ],
+  "accessors": [
+    {
+      "bufferView": 0,
+      "componentType": 5126,
+      "count": 35903,
+      "max": [
+        13.74468994140625,
+        22.657127380371094,
+        3.320786237716675
+      ],
+      "min": [
+        -9.983352661132812,
+        1.1995306015014648,
+        -3.4880359172821045
+      ],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 1,
+      "componentType": 5126,
+      "count": 35903,
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 2,
+      "componentType": 5126,
+      "count": 35903,
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 3,
+      "componentType": 5123,
+      "count": 101148,
+      "type": "SCALAR"
+    },
+    {
+      "bufferView": 4,
+      "componentType": 5126,
+      "count": 24621,
+      "max": [
+        11.63282585144043,
+        5.971731662750244,
+        2.599379539489746
+      ],
+      "min": [
+        -10.325664520263672,
+        -1.9999947547912598,
+        -2.602752923965454
+      ],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 5,
+      "componentType": 5126,
+      "count": 24621,
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 6,
+      "componentType": 5126,
+      "count": 24621,
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 7,
+      "componentType": 5123,
+      "count": 83694,
+      "type": "SCALAR"
+    },
+    {
+      "bufferView": 8,
+      "componentType": 5126,
+      "count": 4020,
+      "max": [
+        8.375848770141602,
+        16.878726959228516,
+        2.797043800354004
+      ],
+      "min": [
+        -1.5351202487945557,
+        4.7319488525390625,
+        -3.2490220069885254
+      ],
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 9,
+      "componentType": 5126,
+      "count": 4020,
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 10,
+      "componentType": 5126,
+      "count": 4020,
+      "type": "VEC2"
+    },
+    {
+      "bufferView": 11,
+      "componentType": 5123,
+      "count": 22644,
+      "type": "SCALAR"
+    }
+  ],
+  "bufferViews": [
+    {
+      "buffer": 0,
+      "byteLength": 430836,
+      "byteOffset": 0
+    },
+    {
+      "buffer": 0,
+      "byteLength": 430836,
+      "byteOffset": 430836
+    },
+    {
+      "buffer": 0,
+      "byteLength": 287224,
+      "byteOffset": 861672
+    },
+    {
+      "buffer": 0,
+      "byteLength": 202296,
+      "byteOffset": 1148896
+    },
+    {
+      "buffer": 0,
+      "byteLength": 295452,
+      "byteOffset": 1351192
+    },
+    {
+      "buffer": 0,
+      "byteLength": 295452,
+      "byteOffset": 1646644
+    },
+    {
+      "buffer": 0,
+      "byteLength": 196968,
+      "byteOffset": 1942096
+    },
+    {
+      "buffer": 0,
+      "byteLength": 167388,
+      "byteOffset": 2139064
+    },
+    {
+      "buffer": 0,
+      "byteLength": 48240,
+      "byteOffset": 2306452
+    },
+    {
+      "buffer": 0,
+      "byteLength": 48240,
+      "byteOffset": 2354692
+    },
+    {
+      "buffer": 0,
+      "byteLength": 32160,
+      "byteOffset": 2402932
+    },
+    {
+      "buffer": 0,
+      "byteLength": 45288,
+      "byteOffset": 2435092
+    }
+  ],
+  "samplers": [
+    {
+      "magFilter": 9729,
+      "minFilter": 9987
+    }
+  ],
+  "buffers": [
+    {
+      "byteLength": 2480380,
+      "uri": "dutch_ship_medium.bin"
+    }
+  ]
+}

+ 28 - 0
3d/antialiasing/polyhaven/dutch_ship_medium_1k.gltf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="scene"
+importer_version=1
+type="PackedScene"
+uid="uid://sxx5ow26t0c3"
+path="res://.godot/imported/dutch_ship_medium_1k.gltf-9a8c4d23ef33512c7c0e526560b6a545.scn"
+
+[deps]
+
+source_file="res://polyhaven/dutch_ship_medium_1k.gltf"
+dest_files=["res://.godot/imported/dutch_ship_medium_1k.gltf-9a8c4d23ef33512c7c0e526560b6a545.scn"]
+
+[params]
+
+nodes/root_type="Node3D"
+nodes/root_name="Scene Root"
+nodes/root_scale=1.0
+meshes/ensure_tangents=true
+meshes/generate_lods=true
+meshes/create_shadow_meshes=true
+meshes/light_baking=1
+meshes/lightmap_texel_size=0.2
+skins/use_named_skins=true
+animation/import=true
+animation/fps=30
+import_script/path=""
+_subresources={}

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_arm_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_arm_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhmrl40t2na37"
+path.s3tc="res://.godot/imported/dutch_ship_medium_hull_arm_1k.jpg-1bcb2be1a58190217bafabbba5a96cb5.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_hull_arm_1k.jpg-1bcb2be1a58190217bafabbba5a96cb5.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_hull_arm_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_hull_arm_1k.jpg-1bcb2be1a58190217bafabbba5a96cb5.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_hull_arm_1k.jpg-1bcb2be1a58190217bafabbba5a96cb5.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_diff_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_diff_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://88gdijjjr6p4"
+path.s3tc="res://.godot/imported/dutch_ship_medium_hull_diff_1k.jpg-d22f57383d3437ac6151a5dc155d1b44.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_hull_diff_1k.jpg-d22f57383d3437ac6151a5dc155d1b44.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_hull_diff_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_hull_diff_1k.jpg-d22f57383d3437ac6151a5dc155d1b44.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_hull_diff_1k.jpg-d22f57383d3437ac6151a5dc155d1b44.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c22y3qjf8th8a"
+path.s3tc="res://.godot/imported/dutch_ship_medium_hull_nor_gl_1k.jpg-f0fc1f178ac5ff99bdf2aae06e0701f1.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_hull_nor_gl_1k.jpg-f0fc1f178ac5ff99bdf2aae06e0701f1.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_hull_nor_gl_1k.jpg-f0fc1f178ac5ff99bdf2aae06e0701f1.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_hull_nor_gl_1k.jpg-f0fc1f178ac5ff99bdf2aae06e0701f1.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=1
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=1
+roughness/src_normal="res://polyhaven/textures/dutch_ship_medium_hull_nor_gl_1k.jpg"
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_arm_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_arm_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://15se8alkcbla"
+path.s3tc="res://.godot/imported/dutch_ship_medium_rigging_arm_1k.jpg-6de8e054b6e80b00009332eaf9eafbeb.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_rigging_arm_1k.jpg-6de8e054b6e80b00009332eaf9eafbeb.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_rigging_arm_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_rigging_arm_1k.jpg-6de8e054b6e80b00009332eaf9eafbeb.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_rigging_arm_1k.jpg-6de8e054b6e80b00009332eaf9eafbeb.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_diff_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_diff_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0yhj4wwbvgvu"
+path.s3tc="res://.godot/imported/dutch_ship_medium_rigging_diff_1k.jpg-b381c8dba5fcad22696086becdc354b0.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_rigging_diff_1k.jpg-b381c8dba5fcad22696086becdc354b0.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_rigging_diff_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_rigging_diff_1k.jpg-b381c8dba5fcad22696086becdc354b0.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_rigging_diff_1k.jpg-b381c8dba5fcad22696086becdc354b0.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csbfe6x0jyswi"
+path.s3tc="res://.godot/imported/dutch_ship_medium_rigging_nor_gl_1k.jpg-26a255f6574d49990ad4162b06c015da.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_rigging_nor_gl_1k.jpg-26a255f6574d49990ad4162b06c015da.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_rigging_nor_gl_1k.jpg-26a255f6574d49990ad4162b06c015da.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_rigging_nor_gl_1k.jpg-26a255f6574d49990ad4162b06c015da.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=1
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=1
+roughness/src_normal="res://polyhaven/textures/dutch_ship_medium_rigging_nor_gl_1k.jpg"
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_arm_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_arm_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://70shlrquand4"
+path.s3tc="res://.godot/imported/dutch_ship_medium_sails_arm_1k.jpg-6cdf6ae207b4bb5365f0df8bebf34d57.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_sails_arm_1k.jpg-6cdf6ae207b4bb5365f0df8bebf34d57.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_sails_arm_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_sails_arm_1k.jpg-6cdf6ae207b4bb5365f0df8bebf34d57.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_sails_arm_1k.jpg-6cdf6ae207b4bb5365f0df8bebf34d57.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_diff_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_diff_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dde6ofm1jcwiv"
+path.s3tc="res://.godot/imported/dutch_ship_medium_sails_diff_1k.jpg-501769b3e14d33a1ff05b4b14f45b65b.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_sails_diff_1k.jpg-501769b3e14d33a1ff05b4b14f45b65b.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_sails_diff_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_sails_diff_1k.jpg-501769b3e14d33a1ff05b4b14f45b65b.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_sails_diff_1k.jpg-501769b3e14d33a1ff05b4b14f45b65b.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

BIN
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg


+ 36 - 0
3d/antialiasing/polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://doc73t5xbl8to"
+path.s3tc="res://.godot/imported/dutch_ship_medium_sails_nor_gl_1k.jpg-8bd26cb4511a8400046da66b710b48cf.s3tc.ctex"
+path.etc2="res://.godot/imported/dutch_ship_medium_sails_nor_gl_1k.jpg-8bd26cb4511a8400046da66b710b48cf.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg"
+dest_files=["res://.godot/imported/dutch_ship_medium_sails_nor_gl_1k.jpg-8bd26cb4511a8400046da66b710b48cf.s3tc.ctex", "res://.godot/imported/dutch_ship_medium_sails_nor_gl_1k.jpg-8bd26cb4511a8400046da66b710b48cf.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=1
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=1
+roughness/src_normal="res://polyhaven/textures/dutch_ship_medium_sails_nor_gl_1k.jpg"
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

+ 32 - 0
3d/antialiasing/project.godot

@@ -0,0 +1,32 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=5
+
+_global_script_classes=[]
+_global_script_class_icons={}
+
+[application]
+
+config/name="3D Anti-Aliasing"
+config/description="This project showcases the various 3D antialiasing techniques supported by Godot."
+run/main_scene="res://anti_aliasing.tscn"
+config/features=PackedStringArray("4.0")
+config/icon="res://icon.png"
+
+[display]
+
+window/stretch/mode="canvas_items"
+window/stretch/aspect="expand"
+
+[rendering]
+
+textures/default_filters/anisotropic_filtering_level=4
+textures/decals/filter=4
+quality/screen_filters/msaa=3
+environment/default_environment="res://default_env.tres"

+ 0 - 0
3d/antialiasing/screenshots/.gdignore


BIN
3d/antialiasing/screenshots/3d_anti_aliasing.png


+ 7 - 0
3d/antialiasing/textures/checker.LICENSE.md

@@ -0,0 +1,7 @@
+# License for `checker.png`
+
+Copyright (c) 2020 Kenney
+
+Licensed under CC0 1.0 Universal.
+
+Downloaded from https://kenney.nl/assets/prototype-textures

BIN
3d/antialiasing/textures/checker.png


+ 36 - 0
3d/antialiasing/textures/checker.png.import

@@ -0,0 +1,36 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://chjqieyps5n5r"
+path.s3tc="res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.s3tc.ctex"
+path.etc2="res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.etc2.ctex"
+metadata={
+"imported_formats": ["s3tc", "etc2"],
+"vram_texture": true
+}
+
+[deps]
+
+source_file="res://textures/checker.png"
+dest_files=["res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.s3tc.ctex", "res://.godot/imported/checker.png-d334a8ae07de292fd4162f184b9dd7bc.etc2.ctex"]
+
+[params]
+
+compress/mode=2
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=true
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=0

+ 7 - 0
3d/antialiasing/textures/paint.LICENSE.md

@@ -0,0 +1,7 @@
+# License for `paint.png` and `paint_normal.png`
+
+Copyright (c) 2010 johndn
+
+Licensed under CC BY 3.0 Unported.
+
+Downloaded from https://opengameart.org/content/splatter-pack

BIN
3d/antialiasing/textures/paint.png


+ 34 - 0
3d/antialiasing/textures/paint.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccgkupemr6e1q"
+path="res://.godot/imported/paint.png-879be22678d20d2d134debfc46f5226d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://textures/paint.png"
+dest_files=["res://.godot/imported/paint.png-879be22678d20d2d134debfc46f5226d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

BIN
3d/antialiasing/textures/paint_normal.png


+ 34 - 0
3d/antialiasing/textures/paint_normal.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bm6eht0bqttpo"
+path="res://.godot/imported/paint_normal.png-7924e58454336706ecd6d73c7236cdd3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://textures/paint_normal.png"
+dest_files=["res://.godot/imported/paint_normal.png-7924e58454336706ecd6d73c7236cdd3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

+ 114 - 0
3d/antialiasing/thin_lines.tscn

@@ -0,0 +1,114 @@
+[gd_scene load_steps=2 format=3 uid="uid://daokc0jvx7nkw"]
+
+[sub_resource type="PrismMesh" id="PrismMesh_70tw2"]
+size = Vector3(0.02, 1, 0.02)
+
+[node name="ThinLines" type="Node3D"]
+
+[node name="Line1" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, 0.4)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line2" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, 0.3)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line3" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, 0.2)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line4" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, 0.1)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line5" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line6" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, -0.1)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line7" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, -0.2)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line8" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, -0.3)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line9" type="MeshInstance3D" parent="."]
+transform = Transform3D(0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0.5, -0.4)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line10" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.4, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line11" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.3, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line12" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.2, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line13" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.1, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line14" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line15" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0.1, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line16" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0.2, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line17" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0.3, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line18" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, -1, 0.4, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line19" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, -0.4, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line20" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, -0.3, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line21" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, -0.2, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line22" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, -0.1, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line23" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line24" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0.1, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line25" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0.2, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line26" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0.3, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")
+
+[node name="Line27" type="MeshInstance3D" parent="."]
+transform = Transform3D(-1, 0, 0, 0, 0, -1, 0, -1, 0, 0.4, 0.5, 0)
+mesh = SubResource("PrismMesh_70tw2")