Add a 3D antialiasing demo

This commit is contained in:
Hugo Locurcio
2022-05-17 02:31:43 +02:00
committed by Aaron Franke
parent 5efee6741f
commit 9dbd05a8a8
39 changed files with 2045 additions and 0 deletions

41
3d/antialiasing/README.md Normal file
View File

@@ -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.

View File

@@ -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

View File

@@ -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"]

View File

@@ -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 Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -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

Binary file not shown.

View File

@@ -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"
}
]
}

View File

@@ -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={}

Binary file not shown.

After

Width:  |  Height:  |  Size: 969 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

View File

@@ -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

View File

@@ -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"

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -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

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View File

@@ -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

View File

@@ -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")