├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── crt_material.tres ├── crt_shader.shader ├── default_env.tres ├── demo_scene.tscn ├── examples ├── crt-off.png ├── crt-off.png.import ├── crt-on.png └── crt-on.png.import ├── icon.png ├── icon.png.import └── project.godot /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: hiulit 2 | ko_fi: hiulit 3 | custom: https://www.paypal.me/hiulit 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | exampless/*.import 3 | 4 | # Godot-specific ignores 5 | .import/ 6 | export.cfg 7 | export_presets.cfg -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## Unreleased 4 | 5 | * Up to date. 6 | 7 | ## [2.0.0] - 2020-10-20 8 | 9 | **NOTE**: This release contains breaking changes. 10 | 11 | The parameters are basically the same but with new names. Check the [documentation](https://github.com/hiulit/Godot-3-2D-CRT-Shader/tree/master#shader-parameters). 12 | 13 | ### Added 14 | 15 | * `curvature_x_amount` - Controls the curvature on the X axis. 16 | * `curvature_y_amount` - Controls the curvature on the Y axis. 17 | 18 | ### Changed 19 | 20 | * Every mention to **grille** is now referred as **vertical scan lines**. 21 | 22 | ### Deprecated 23 | 24 | * ~~`scanlines_speed`~~ 25 | * ~~`move_aberration`~~ 26 | * ~~`aberration_speed`~~ 27 | 28 | ## [1.3.1] - 2020-10-19 29 | 30 | ### Fixed 31 | 32 | * The scanlines and grille are now non-destructive. This allows to lower the opacity of the scanlines and grille without resulting in a completely black screen. Thanks to [Miltage](https://github.com/Miltage) for helping with this issue [#5](https://github.com/hiulit/Godot-3-2D-CRT-Shader/pull/5). 33 | 34 | ## [1.3.0] - 2019-09-13 35 | 36 | ### Added 37 | 38 | * New parameter: `aberration_amount` - To control the amount of aberration. 39 | * New parameter: `move_aberration` - To control the movement state of the aberration. 40 | * New parameter: `aberration_speed` - To control the speed of the moving aberration. 41 | 42 | ### Changed 43 | 44 | * `boost` parameter now can go up to `2.0`. 45 | * `vignette` now depends on the screen size. 46 | 47 | ## [1.2.0] - 2019-07-18 48 | 49 | ### Added 50 | 51 | * Screen texture and scanlines are now affected by curvature. 52 | * New parameter: `grille_opacity` - To control the opacity of the grille. 53 | * New parameter: `scanlines_opacity` - To control the opacity of the scanlines. 54 | * New parameter: `scanlines_speed` - To control the speed of the scanlines. 55 | * New parameter: `screen_size` - To control how many grille lines and scanlines appear. 56 | 57 | ### Changed 58 | 59 | * `boost` and `vignette_opacity` steps are now `0.01`. 60 | * `vignette_opacity` default value is now `0.2`. 61 | 62 | ### Deprecated 63 | 64 | * Parameter: `blend_color` - No longer needed. 65 | 66 | ## [1.1.0] - 2019-07-15 67 | 68 | ### Added 69 | 70 | * More parameters to adjust the shader: 71 | * `vignette_opacity` 72 | * `show_grille` 73 | * `show_scanlines` 74 | * `show_vignette` 75 | * `show_curvature` 76 | 77 | ## [1.0.0] - 2019-06-27 78 | 79 | * Released stable version. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Xavier Gómez Gosálbez (a.k.a. hiulit) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Godot 3 2D CRT Shader 2 | 3 | A 2D shader for Godot 3 simulating a CRT. 4 | 5 | ![A 2D shader for Godot 3 simulating a CRT - OFF](/examples/crt-off.png) 6 | ![A 2D shader for Godot 3 simulating a CRT - ON](/examples/crt-on.png) 7 | 8 | ## Usage 9 | 10 | * Create a `CanvasLayer`. 11 | * Add a `ColorRect` as a child node of the `CanvasLayer`. 12 | * In the `ColorRect` properties: 13 | * Go to the **Material** section. 14 | * Click on the `[empty]` dropdown from **Material** and load `crt_material.tres`. 15 | 16 | ### Note 17 | If for some reason, when loading the `crt_material.tres`, the `crt_shader.shader` is empty, just open it with any text editor, copy the code in the **Shader** editor and save it. 18 | 19 | ## Shader Parameters 20 | 21 | ### Screen size 22 | 23 | | Name | Type | Default | Description | 24 | | --- | --- | --- | --- | 25 | | `screen_size` | `vec2` | `vec2(320.0, 180.0)` | The size of your project's `display/window/size`. | 26 | 27 | ### Show curvature 28 | 29 | | Name | Type | Default | Description | 30 | | --- | --- | --- | --- | 31 | | `show_curvature` | `bool` | `true` | Enables/disables the curvature effect. | 32 | 33 | Works best in `window/stretch/mode="2d"`. 34 | 35 | ### Curvature X amount 36 | 37 | | Name | Type | Default | Description | 38 | | --- | --- | --- | --- | 39 | | `curvature_x_amount` | `float` | `6.0` | Controls the curvature on the X axis. The lower the amount, the lower distortion. Range from `3.0` to `15.0` with `0.01` steps. | 40 | 41 | ### Curvature Y amount 42 | 43 | | Name | Type | Default | Description | 44 | | --- | --- | --- | --- | 45 | | `curvature_y_amount` | `float` | `6.0` | Controls the curvature on the Y axis. The lower the amount, the lower distortion. Range from `3.0` to `15.0` with `0.01` steps. | 46 | 47 | ### Corner color 48 | | Name | Type | Default | Description | 49 | | --- | --- | --- | --- | 50 | | `corner_color` | `vec4` | `vec4(0.0, 0.0, 0.0, 1.0)` | The color of the blank space on the corners left by the curvature. | 51 | 52 | ### Show vignette 53 | 54 | | Name | Type | Default | Description | 55 | | --- | --- | --- | --- | 56 | | `show_vignette` | `bool` | `true` | Enables/disables the vignette effect. | 57 | 58 | ### Vignette opacity 59 | 60 | | Name | Type | Default | Description | 61 | | --- | --- | --- | --- | 62 | | `vignette_opacity` | `float` | `0.2` | Controls the opacity of the vignette. Range from `0.0` to `1.0` with `0.01` steps. | 63 | 64 | ### Show horizontal scan lines 65 | 66 | | Name | Type | Default | Description | 67 | | --- | --- | --- | --- | 68 | | `show_horizontal_scan_lines` | `bool` | `true` | Enables/disables the horizontal scan lines. | 69 | 70 | ### Horizontal scan lines amount 71 | 72 | | Name | Type | Default | Description | 73 | | --- | --- | --- | --- | 74 | | `horizontal_scan_lines_amount` | `float` | `180.0` | Controls how many horizontal scan lines appear. Range from `0.0` to `180.0` with `0.1` steps. | 75 | 76 | Setting it to your project's `windows/size/height` should work fine, but you can play with it to get the results best fitted to your liking. 77 | 78 | Having fewer scan lines will make them larger, which makes it harder for the moire effect to appear. 79 | 80 | ### Horizontal scan lines opacity 81 | 82 | | Name | Type | Default | Description | 83 | | --- | --- | --- | --- | 84 | | `horizontal_scan_lines_opacity` | `float` | `1.0` | Controls the opacity of the horizontal scan lines. `0.0` is complete opaque. Range from `0.0` to `1.0` with `0.01` steps. | 85 | 86 | ### Show vertical scan lines 87 | 88 | | Name | Type | Default | Description | 89 | | --- | --- | --- | --- | 90 | | `show_vertical_scan_lines` | `bool` | `true` | Enables/disables the vertical scan lines. | 91 | 92 | ### Vertical scan lines amount 93 | 94 | | Name | Type | Default | Description | 95 | | --- | --- | --- | --- | 96 | | `vertical_scan_lines_amount` | `float` | `320.0` | Controls how many vertical scan lines appear. Range from `0.0` to `320.0` with `0.1` steps. | 97 | 98 | Setting it to your project's `windows/size/width` should work fine, but you can play with it to get the results best fitted to your liking. 99 | 100 | Having fewer scan lines will make them larger, which makes it harder for the moire effect to appear. 101 | 102 | ### Vertical scan lines opacity 103 | 104 | | Name | Type | Default | Description | 105 | | --- | --- | --- | --- | 106 | | `vertical_scan_lines_opacity` | `float` | `1.0` | Controls the opacity of the vertical scan lines. `0.0` is complete opaque. Range from `0.0` to `1.0` with `0.01` steps. | 107 | 108 | ### Boost 109 | 110 | | Name | Type | Default | Description | 111 | | --- | --- | --- | --- | 112 | | `boost` | `float` | `1.2` | Gives extra brightness to compensate the scanlines and the vignette. Range from `1.0` to `2.0` with `0.01` steps. | 113 | 114 | ### Aberration amount 115 | 116 | | Name | Type | Default | Description | 117 | | --- | --- | --- | --- | 118 | | `aberration_amount` | `float` | `0.0` | Controls the amount of chromatic aberration. Range from `0.0` to `10.0` with `0.01` steps. | 119 | 120 | ## Changelog 121 | 122 | See [CHANGELOG](/CHANGELOG.md). 123 | 124 | ## Authors 125 | 126 | * Me 😛 [hiulit](https://github.com/hiulit). 127 | 128 | ## Credits 129 | 130 | Thanks to: 131 | 132 | * **knarkowicz** - For the orginal shader code, taken from https://www.shadertoy.com/view/XtlSD7. 133 | * [CowThing](https://github.com/CowThing) - For helping **a lot** in bringing actual distortion and many other improvements to the shader with [#1](https://github.com/hiulit/Godot-3-2D-CRT-Shader/pull/1). 134 | * [uheartbeast](https://twitter.com/uheartbeast) - For the amazing [chromatic aberration shader video tutorial](https://www.youtube.com/watch?v=-PJOHAsBcoI). 135 | * [Miltage](https://github.com/Miltage) - For helping in fixing an issue with the scan lines opacity [#5](https://github.com/hiulit/Godot-3-2D-CRT-Shader/pull/5). 136 | * [Tom (Let's GameDev)](https://twitter.com/letsgamedev) - For the amazing [CRT shader video tutorial](https://www.youtube.com/watch?v=Dn8joy4tP2Q), which I took the scan lines from. 137 | 138 | ## License 139 | 140 | [MIT License](/LICENSE). -------------------------------------------------------------------------------- /crt_material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ShaderMaterial" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://crt_shader.shader" type="Shader" id=1] 4 | 5 | [resource] 6 | shader = ExtResource( 1 ) 7 | shader_param/screen_size = Vector2( 320, 180 ) 8 | shader_param/show_curvature = true 9 | shader_param/curvature_x_amount = 6.0 10 | shader_param/curvature_y_amount = 4.0 11 | shader_param/corner_color = Color( 0, 0, 0, 1 ) 12 | shader_param/show_vignette = true 13 | shader_param/vignette_opacity = 0.2 14 | shader_param/show_horizontal_scan_lines = true 15 | shader_param/horizontal_scan_lines_amount = 180.0 16 | shader_param/horizontal_scan_lines_opacity = 1.0 17 | shader_param/show_vertical_scan_lines = false 18 | shader_param/vertical_scan_lines_amount = 320.0 19 | shader_param/vertical_scan_lines_opacity = 1.0 20 | shader_param/boost = 1.2 21 | shader_param/aberration_amount = 0.0 22 | -------------------------------------------------------------------------------- /crt_shader.shader: -------------------------------------------------------------------------------- 1 | /* 2 | Godot 3 2D CRT Shader. 3 | A 2D shader for Godot 3 simulating a CRT.. 4 | 5 | Author: hiulit 6 | Repository: https://github.com/hiulit/Godot-3-2D-CRT-Shader 7 | Issues: https://github.com/hiulit/Godot-3-2D-CRT-Shader/issues 8 | License: MIT https://github.com/hiulit/Godot-3-2D-CRT-Shader/blob/master/LICENSE 9 | */ 10 | 11 | shader_type canvas_item; 12 | 13 | const float PI = 3.14159265359; 14 | 15 | uniform vec2 screen_size = vec2(320.0, 180.0); 16 | uniform bool show_curvature = true; 17 | uniform float curvature_x_amount : hint_range(3.0, 15.0, 0.01) = float(6.0); 18 | uniform float curvature_y_amount : hint_range(3.0, 15.0, 0.01) = float(4.0); 19 | uniform vec4 corner_color : hint_color = vec4(0.0, 0.0, 0.0, 1.0); 20 | uniform bool show_vignette = true; 21 | uniform float vignette_opacity : hint_range(0.0, 1.0, 0.01) = 0.2; 22 | uniform bool show_horizontal_scan_lines = true; 23 | uniform float horizontal_scan_lines_amount : hint_range(0.0, 180.0, 0.1) = 180.0; 24 | uniform float horizontal_scan_lines_opacity : hint_range(0.0, 1.0, 0.01) = 1.0; 25 | uniform bool show_vertical_scan_lines = false; 26 | uniform float vertical_scan_lines_amount : hint_range(0.0, 320.0, 0.1) = 320.0; 27 | uniform float vertical_scan_lines_opacity : hint_range(0.0, 1.0, 0.01) = 1.0; 28 | uniform float boost : hint_range(1.0, 2.0, 0.01) = 1.2; 29 | uniform float aberration_amount : hint_range(0.0, 10.0, 0.01) = 0.0; 30 | 31 | vec2 uv_curve(vec2 uv) { 32 | if (show_curvature) { 33 | uv = uv * 2.0 - 1.0; 34 | vec2 offset = abs(uv.yx) / vec2(curvature_x_amount, curvature_y_amount); 35 | uv = uv + uv * offset * offset; 36 | uv = uv * 0.5 + 0.5; 37 | } 38 | 39 | return uv; 40 | } 41 | 42 | 43 | void fragment() { 44 | vec2 uv = uv_curve(UV); 45 | vec2 screen_uv = uv_curve(SCREEN_UV); 46 | vec3 color = texture(SCREEN_TEXTURE, screen_uv).rgb; 47 | 48 | if (aberration_amount > 0.0) { 49 | float adjusted_amount = aberration_amount / screen_size.x; 50 | color.r = texture(SCREEN_TEXTURE, vec2(screen_uv.x + adjusted_amount, screen_uv.y)).r; 51 | color.g = texture(SCREEN_TEXTURE, screen_uv).g; 52 | color.b = texture(SCREEN_TEXTURE, vec2(screen_uv.x - adjusted_amount, screen_uv.y)).b; 53 | } 54 | 55 | if (show_vignette) { 56 | float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y); 57 | vignette = clamp(pow((screen_size.x / 4.0) * vignette, vignette_opacity), 0.0, 1.0); 58 | color *= vignette; 59 | } 60 | 61 | if (show_horizontal_scan_lines) { 62 | float s = sin(screen_uv.y * horizontal_scan_lines_amount * PI * 2.0); 63 | s = (s * 0.5 + 0.5) * 0.9 + 0.1; 64 | vec4 scan_line = vec4(vec3(pow(s, horizontal_scan_lines_opacity)), 1.0); 65 | color *= scan_line.rgb; 66 | } 67 | 68 | if (show_vertical_scan_lines) { 69 | float s = sin(screen_uv.x * vertical_scan_lines_amount * PI * 2.0); 70 | s = (s * 0.5 + 0.5) * 0.9 + 0.1; 71 | vec4 scan_line = vec4(vec3(pow(s, vertical_scan_lines_opacity)), 1.0); 72 | color *= scan_line.rgb; 73 | } 74 | 75 | if (show_horizontal_scan_lines || show_vertical_scan_lines) { 76 | color *= boost; 77 | } 78 | 79 | // Fill the blank space of the corners, left by the curvature, with black. 80 | if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { 81 | color = corner_color.rgb; 82 | } 83 | 84 | COLOR = vec4(color, 1.0); 85 | } 86 | -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /demo_scene.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://icon.png" type="Texture" id=1] 4 | [ext_resource path="res://crt_material.tres" type="Material" id=2] 5 | 6 | [node name="crt_layer" type="CanvasLayer"] 7 | 8 | [node name="background" type="ColorRect" parent="."] 9 | anchor_right = 1.0 10 | anchor_bottom = 1.0 11 | 12 | [node name="icon" type="Sprite" parent="."] 13 | position = Vector2( 71.3842, 70.2482 ) 14 | texture = ExtResource( 1 ) 15 | 16 | [node name="icon2" type="Sprite" parent="."] 17 | position = Vector2( 246.99, 107.356 ) 18 | texture = ExtResource( 1 ) 19 | 20 | [node name="crt_shader" type="ColorRect" parent="."] 21 | material = ExtResource( 2 ) 22 | anchor_right = 1.0 23 | anchor_bottom = 1.0 24 | __meta__ = { 25 | "_edit_use_anchors_": false 26 | } 27 | -------------------------------------------------------------------------------- /examples/crt-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hiulit/Godot-3-2D-CRT-Shader/62052678cb84cc13ca6d54eea37527ad5d446ecb/examples/crt-off.png -------------------------------------------------------------------------------- /examples/crt-off.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/crt-off.png-19ebecaf0bb888e8e7f540098e0a0ab3.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://examples/crt-off.png" 13 | dest_files=[ "res://.import/crt-off.png-19ebecaf0bb888e8e7f540098e0a0ab3.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /examples/crt-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hiulit/Godot-3-2D-CRT-Shader/62052678cb84cc13ca6d54eea37527ad5d446ecb/examples/crt-on.png -------------------------------------------------------------------------------- /examples/crt-on.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/crt-on.png-a6b5fd87de1a9837163bb4ce827077d5.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://examples/crt-on.png" 13 | dest_files=[ "res://.import/crt-on.png-a6b5fd87de1a9837163bb4ce827077d5.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hiulit/Godot-3-2D-CRT-Shader/62052678cb84cc13ca6d54eea37527ad5d446ecb/icon.png -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="Godot-3-2D-CRT-Shader" 19 | run/main_scene="res://demo_scene.tscn" 20 | config/icon="res://icon.png" 21 | 22 | [display] 23 | 24 | window/size/width=320 25 | window/size/height=180 26 | window/size/test_width=640 27 | window/size/test_height=360 28 | window/stretch/mode="2d" 29 | window/stretch/aspect="keep" 30 | 31 | [rendering] 32 | 33 | quality/2d/use_pixel_snap=true 34 | environment/default_environment="res://default_env.tres" 35 | quality/dynamic_fonts/use_oversampling=false 36 | --------------------------------------------------------------------------------