aboutsummaryrefslogtreecommitdiff
path: root/raylib/examples/shaders
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-10-15 21:28:29 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-10-15 21:28:29 -0300
commit1c0cc775732201f4c4d3ee0d6772be786b3b4aa1 (patch)
treef5d692d046868261275c7430a624c3ea9ed75d3d /raylib/examples/shaders
parenta89f892640cf12f75c7ce18e6e88c70a8d3965ed (diff)
A lot has certainly happened!
Diffstat (limited to 'raylib/examples/shaders')
-rw-r--r--raylib/examples/shaders/resources/LICENSE.md13
-rw-r--r--raylib/examples/shaders/resources/cubicmap_atlas.pngbin0 -> 37160 bytes
-rw-r--r--raylib/examples/shaders/resources/fudesumi.pngbin0 -> 222775 bytes
-rw-r--r--raylib/examples/shaders/resources/mask.pngbin0 -> 74346 bytes
-rw-r--r--raylib/examples/shaders/resources/models/barracks_diffuse.pngbin0 -> 371728 bytes
-rw-r--r--raylib/examples/shaders/resources/models/church_diffuse.pngbin0 -> 358600 bytes
-rw-r--r--raylib/examples/shaders/resources/models/watermill_diffuse.pngbin0 -> 447606 bytes
-rw-r--r--raylib/examples/shaders/resources/plasma.pngbin0 -> 581880 bytes
-rw-r--r--raylib/examples/shaders/resources/raysan.pngbin0 -> 5752 bytes
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/base.fs23
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/base.vs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/bloom.fs39
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/blur.fs34
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs47
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs57
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs60
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/depth.fs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/distortion.fs54
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs37
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs60
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs43
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/fog.fs94
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs25
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs16
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs288
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs83
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/lighting.fs81
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/lighting.vs59
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs36
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/mask.fs24
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/outline.fs34
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs41
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs32
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/posterization.fs29
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/predator.fs31
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs431
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/reload.fs39
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs44
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/sobel.fs40
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs77
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/swirl.fs46
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/wave.fs36
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs17
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/base.fs22
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/base.vs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/bloom.fs37
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/blur.fs32
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs45
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs55
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/distortion.fs52
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs35
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs41
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/fog.fs92
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs23
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/lighting.fs79
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/lighting.vs59
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs27
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs30
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/posterization.fs27
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/predator.fs29
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs42
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/sobel.fs38
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/swirl.fs44
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/base.fs25
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/base.vs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/bloom.fs40
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/blur.fs35
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs27
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs48
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs59
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs61
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/depth.fs27
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/distortion.fs56
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs34
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs59
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs40
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/fog.fs95
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs14
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs284
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs81
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lighting.fs82
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lighting.vs32
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs36
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs23
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs29
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/mask.fs22
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/outline.fs35
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs26
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs30
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs33
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/posterization.fs31
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/predator.fs32
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs430
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/reload.fs40
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs49
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/sobel.fs41
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs65
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/swirl.fs47
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/tiling.fs14
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/wave.fs37
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs20
-rw-r--r--raylib/examples/shaders/resources/space.pngbin0 -> 22425 bytes
-rw-r--r--raylib/examples/shaders/resources/spark_flame.pngbin0 -> 7537 bytes
-rw-r--r--raylib/examples/shaders/resources/texel_checker.pngbin0 -> 93185 bytes
-rw-r--r--raylib/examples/shaders/rlights.h170
-rw-r--r--raylib/examples/shaders/shader_texture_tiling.c94
-rw-r--r--raylib/examples/shaders/shaders_basic_lighting.c148
-rw-r--r--raylib/examples/shaders/shaders_basic_lighting.pngbin0 -> 170325 bytes
-rw-r--r--raylib/examples/shaders/shaders_custom_uniform.c129
-rw-r--r--raylib/examples/shaders/shaders_custom_uniform.pngbin0 -> 331971 bytes
-rw-r--r--raylib/examples/shaders/shaders_eratosthenes.c97
-rw-r--r--raylib/examples/shaders/shaders_eratosthenes.pngbin0 -> 619472 bytes
-rw-r--r--raylib/examples/shaders/shaders_fog.c155
-rw-r--r--raylib/examples/shaders/shaders_fog.pngbin0 -> 134774 bytes
-rw-r--r--raylib/examples/shaders/shaders_hot_reloading.c135
-rw-r--r--raylib/examples/shaders/shaders_hot_reloading.pngbin0 -> 17029 bytes
-rw-r--r--raylib/examples/shaders/shaders_hybrid_render.c208
-rw-r--r--raylib/examples/shaders/shaders_hybrid_render.pngbin0 -> 111135 bytes
-rw-r--r--raylib/examples/shaders/shaders_julia_set.c196
-rw-r--r--raylib/examples/shaders/shaders_julia_set.pngbin0 -> 357391 bytes
-rw-r--r--raylib/examples/shaders/shaders_lightmap.c173
-rw-r--r--raylib/examples/shaders/shaders_lightmap.pngbin0 -> 209671 bytes
-rw-r--r--raylib/examples/shaders/shaders_mesh_instancing.c147
-rw-r--r--raylib/examples/shaders/shaders_mesh_instancing.pngbin0 -> 410192 bytes
-rw-r--r--raylib/examples/shaders/shaders_model_shader.c107
-rw-r--r--raylib/examples/shaders/shaders_model_shader.pngbin0 -> 219627 bytes
-rw-r--r--raylib/examples/shaders/shaders_multi_sample2d.c110
-rw-r--r--raylib/examples/shaders/shaders_multi_sample2d.pngbin0 -> 14804 bytes
-rw-r--r--raylib/examples/shaders/shaders_palette_switch.c152
-rw-r--r--raylib/examples/shaders/shaders_palette_switch.pngbin0 -> 15463 bytes
-rw-r--r--raylib/examples/shaders/shaders_postprocessing.c177
-rw-r--r--raylib/examples/shaders/shaders_postprocessing.pngbin0 -> 142672 bytes
-rw-r--r--raylib/examples/shaders/shaders_raymarching.c116
-rw-r--r--raylib/examples/shaders/shaders_raymarching.pngbin0 -> 463513 bytes
-rw-r--r--raylib/examples/shaders/shaders_shapes_textures.c121
-rw-r--r--raylib/examples/shaders/shaders_shapes_textures.pngbin0 -> 167756 bytes
-rw-r--r--raylib/examples/shaders/shaders_simple_mask.c150
-rw-r--r--raylib/examples/shaders/shaders_simple_mask.pngbin0 -> 437142 bytes
-rw-r--r--raylib/examples/shaders/shaders_spotlight.c255
-rw-r--r--raylib/examples/shaders/shaders_spotlight.pngbin0 -> 120371 bytes
-rw-r--r--raylib/examples/shaders/shaders_texture_drawing.c85
-rw-r--r--raylib/examples/shaders/shaders_texture_drawing.pngbin0 -> 16865 bytes
-rw-r--r--raylib/examples/shaders/shaders_texture_outline.c102
-rw-r--r--raylib/examples/shaders/shaders_texture_outline.pngbin0 -> 264739 bytes
-rw-r--r--raylib/examples/shaders/shaders_texture_waves.c115
-rw-r--r--raylib/examples/shaders/shaders_texture_waves.pngbin0 -> 86453 bytes
-rw-r--r--raylib/examples/shaders/shaders_write_depth.c167
-rw-r--r--raylib/examples/shaders/shaders_write_depth.pngbin0 -> 11174 bytes
150 files changed, 8483 insertions, 0 deletions
diff --git a/raylib/examples/shaders/resources/LICENSE.md b/raylib/examples/shaders/resources/LICENSE.md
new file mode 100644
index 0000000..7210e34
--- /dev/null
+++ b/raylib/examples/shaders/resources/LICENSE.md
@@ -0,0 +1,13 @@
+| resource | author | licence | notes |
+| :----------------- | :-----------: | :------ | :---- |
+| models/barracks.obj,<br> models/barracks_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - |
+| models/church.obj,<br> models/church_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - |
+| models/watermill.obj,<br> models/watermill_diffuse.png | [Alberto Cano](https://www.artstation.com/albertocano) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/legalcode) | - |
+| fudesumi.png | [Eiden Marsal](https://www.artstation.com/marshall_z) | [CC-BY-NC](https://creativecommons.org/licenses/by-nc/4.0/) | - |
+| mask.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [EffectTextureMaker](https://mebiusbox.github.io/contents/EffectTextureMaker/) |
+| plasma.png | [@chriscamacho](https://github.com/chriscamacho) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - |
+| raysan.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - |
+| space.png | ❔ | ❔ | - |
+| texel_checker.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [UV Checker Map Maker](http://uvchecker.byvalle.com/) |
+| cubicmap.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - |
+| spark_flame.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | Made with [EffectTextureMaker](https://mebiusbox.github.io/contents/EffectTextureMaker/) | \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/cubicmap_atlas.png b/raylib/examples/shaders/resources/cubicmap_atlas.png
new file mode 100644
index 0000000..9fc404a
--- /dev/null
+++ b/raylib/examples/shaders/resources/cubicmap_atlas.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/fudesumi.png b/raylib/examples/shaders/resources/fudesumi.png
new file mode 100644
index 0000000..1bf4ab7
--- /dev/null
+++ b/raylib/examples/shaders/resources/fudesumi.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/mask.png b/raylib/examples/shaders/resources/mask.png
new file mode 100644
index 0000000..6fb5ded
--- /dev/null
+++ b/raylib/examples/shaders/resources/mask.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/models/barracks_diffuse.png b/raylib/examples/shaders/resources/models/barracks_diffuse.png
new file mode 100644
index 0000000..ee81621
--- /dev/null
+++ b/raylib/examples/shaders/resources/models/barracks_diffuse.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/models/church_diffuse.png b/raylib/examples/shaders/resources/models/church_diffuse.png
new file mode 100644
index 0000000..73b9fb7
--- /dev/null
+++ b/raylib/examples/shaders/resources/models/church_diffuse.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/models/watermill_diffuse.png b/raylib/examples/shaders/resources/models/watermill_diffuse.png
new file mode 100644
index 0000000..a44d7c6
--- /dev/null
+++ b/raylib/examples/shaders/resources/models/watermill_diffuse.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/plasma.png b/raylib/examples/shaders/resources/plasma.png
new file mode 100644
index 0000000..01c2d88
--- /dev/null
+++ b/raylib/examples/shaders/resources/plasma.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/raysan.png b/raylib/examples/shaders/resources/raysan.png
new file mode 100644
index 0000000..36e13ba
--- /dev/null
+++ b/raylib/examples/shaders/resources/raysan.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/base.fs b/raylib/examples/shaders/resources/shaders/glsl100/base.fs
new file mode 100644
index 0000000..6a8d44e
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/base.fs
@@ -0,0 +1,23 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ gl_FragColor = texelColor*colDiffuse;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/base.vs b/raylib/examples/shaders/resources/shaders/glsl100/base.vs
new file mode 100644
index 0000000..32e8399
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/base.vs
@@ -0,0 +1,26 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs b/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs
new file mode 100644
index 0000000..673e011
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs
@@ -0,0 +1,39 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // render size
+const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture2D(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/blur.fs b/raylib/examples/shaders/resources/shaders/glsl100/blur.fs
new file mode 100644
index 0000000..2fef571
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/blur.fs
@@ -0,0 +1,34 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+vec3 offset = vec3(0.0, 1.3846153846, 3.2307692308);
+vec3 weight = vec3(0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 tc = texture2D(texture0, fragTexCoord).rgb*weight.x;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs b/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs
new file mode 100644
index 0000000..a163a8a
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs
@@ -0,0 +1,26 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+uniform vec4 colDiffuse;
+
+uniform float divider;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor0 = texture2D(texture0, fragTexCoord);
+ vec4 texelColor1 = texture2D(texture1, fragTexCoord);
+
+ float x = fract(fragTexCoord.s);
+ float final = smoothstep(divider - 0.1, divider + 0.1, x);
+
+ gl_FragColor = mix(texelColor0, texelColor1, final);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs b/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs
new file mode 100644
index 0000000..d978de8
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs
@@ -0,0 +1,47 @@
+# version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture2D(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord .x + gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs b/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs
new file mode 100644
index 0000000..a7a348d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs
@@ -0,0 +1,57 @@
+# version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs b/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs
new file mode 100644
index 0000000..9e5eab0
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs
@@ -0,0 +1,60 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Custom variables
+const float PI = 3.14159265358979323846;
+uniform float uTime;
+
+float divisions = 5.0;
+float angle = 0.0;
+
+vec2 VectorRotateTime(vec2 v, float speed)
+{
+ float time = uTime*speed;
+ float localTime = fract(time); // The time domain this works on is 1 sec.
+
+ if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0;
+ else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4.0*sin(2.0*PI*localTime - PI/2.0);
+ else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25;
+ else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4.0*sin(2.0*PI*localTime);
+
+ // Rotate vector by angle
+ v -= 0.5;
+ v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v;
+ v += 0.5;
+
+ return v;
+}
+
+float Rectangle(in vec2 st, in float size, in float fill)
+{
+ float roundSize = 0.5 - size/2.0;
+ float left = step(roundSize, st.x);
+ float top = step(roundSize, st.y);
+ float bottom = step(roundSize, 1.0 - st.y);
+ float right = step(roundSize, 1.0 - st.x);
+
+ return (left*bottom*right*top)*fill;
+}
+
+void main()
+{
+ vec2 fragPos = fragTexCoord;
+ fragPos.xy += uTime/9.0;
+
+ fragPos *= divisions;
+ vec2 ipos = floor(fragPos); // Get the integer coords
+ vec2 fpos = fract(fragPos); // Get the fractional coords
+
+ fpos = VectorRotateTime(fpos, 0.2);
+
+ float alpha = Rectangle(fpos, 0.216, 1.0);
+ vec3 color = vec3(0.3, 0.3, 0.3);
+
+ gl_FragColor = vec4(color, alpha);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/depth.fs b/raylib/examples/shaders/resources/shaders/glsl100/depth.fs
new file mode 100644
index 0000000..7809927
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/depth.fs
@@ -0,0 +1,26 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0; // Depth texture
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ float zNear = 0.01; // camera z near
+ float zFar = 10.0; // camera z far
+ float z = texture2D(texture0, fragTexCoord).x;
+
+ // Linearize depth value
+ float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(depth, depth, depth, 1.0f);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs b/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs
new file mode 100644
index 0000000..c232be2
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs
@@ -0,0 +1,54 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture2D(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture2D(texture0, tcRed).r;
+
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs b/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs
new file mode 100644
index 0000000..7014b59
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs
@@ -0,0 +1,37 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color += texture2D(texture0, fragTexCoord + 0.001);
+ color += texture2D(texture0, fragTexCoord + 0.003);
+ color += texture2D(texture0, fragTexCoord + 0.005);
+ color += texture2D(texture0, fragTexCoord + 0.007);
+ color += texture2D(texture0, fragTexCoord + 0.009);
+ color += texture2D(texture0, fragTexCoord + 0.011);
+
+ color += texture2D(texture0, fragTexCoord - 0.001);
+ color += texture2D(texture0, fragTexCoord - 0.003);
+ color += texture2D(texture0, fragTexCoord - 0.005);
+ color += texture2D(texture0, fragTexCoord - 0.007);
+ color += texture2D(texture0, fragTexCoord - 0.009);
+ color += texture2D(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ gl_FragColor = color;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs b/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs
new file mode 100644
index 0000000..0d5fcc5
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs
@@ -0,0 +1,60 @@
+#version 100
+
+precision mediump float;
+
+/*************************************************************************************
+
+ The Sieve of Eratosthenes -- a simple shader by ProfJski
+ An early prime number sieve: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
+
+ The screen is divided into a square grid of boxes, each representing an integer value.
+ Each integer is tested to see if it is a prime number. Primes are colored white.
+ Non-primes are colored with a color that indicates the smallest factor which evenly divdes our integer.
+
+ You can change the scale variable to make a larger or smaller grid.
+ Total number of integers displayed = scale squared, so scale = 100 tests the first 10,000 integers.
+
+ WARNING: If you make scale too large, your GPU may bog down!
+
+***************************************************************************************/
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Make a nice spectrum of colors based on counter and maxSize
+vec4 Colorizer(float counter, float maxSize)
+{
+ float red = 0.0, green = 0.0, blue = 0.0;
+ float normsize = counter/maxSize;
+
+ red = smoothstep(0.3, 0.7, normsize);
+ green = sin(3.14159*normsize);
+ blue = 1.0 - smoothstep(0.0, 0.4, normsize);
+
+ return vec4(0.8*red, 0.8*green, 0.8*blue, 1.0);
+}
+
+void main()
+{
+ vec4 color = vec4(1.0);
+ float scale = 1000.0; // Makes 100x100 square grid. Change this variable to make a smaller or larger grid.
+ float value = scale*floor(fragTexCoord.y*scale) + floor(fragTexCoord.x*scale); // Group pixels into boxes representing integer values
+ int valuei = int(value);
+
+ //if ((valuei == 0) || (valuei == 1) || (valuei == 2)) gl_FragColor = vec4(1.0);
+ //else
+ {
+ //for (int i = 2; (i < int(max(2.0, sqrt(value) + 1.0))); i++)
+ // NOTE: On GLSL 100 for loops are restricted and loop condition must be a constant
+ // Tested on RPI, it seems loops are limited around 60 iteractions
+ for (int i = 2; i < 48; i++)
+ {
+ if ((value - float(i)*floor(value/float(i))) <= 0.0)
+ {
+ gl_FragColor = Colorizer(float(i), scale);
+ //break; // Uncomment to color by the largest factor instead
+ }
+ }
+ }
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs b/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs
new file mode 100644
index 0000000..c8ca0bb
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs
@@ -0,0 +1,43 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0.0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ gl_FragColor = texture2D(texture0, uv);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/fog.fs b/raylib/examples/shaders/resources/shaders/glsl100/fog.fs
new file mode 100644
index 0000000..c3d0e17
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/fog.fs
@@ -0,0 +1,94 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ gl_FragColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs b/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs
new file mode 100644
index 0000000..0c01fc5
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs
@@ -0,0 +1,25 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs b/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs
new file mode 100644
index 0000000..28188a4
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs
@@ -0,0 +1,16 @@
+#version 100
+#extension GL_EXT_frag_depth : enable // Extension required for writing depth
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepthEXT = gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs b/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs
new file mode 100644
index 0000000..6241186
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs
@@ -0,0 +1,288 @@
+#version 100
+#extension GL_EXT_frag_depth : enable //Extension required for writing depth
+#extension GL_OES_standard_derivatives : enable //Extension used for fwidth()
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Custom Input Uniform
+uniform vec3 camPos;
+uniform vec3 camDir;
+uniform vec2 screenCenter;
+
+#define ZERO 0
+
+// https://learnopengl.com/Advanced-OpenGL/Depth-testing
+float CalcDepth(in vec3 rd, in float Idist){
+ float local_z = dot(normalize(camDir),rd)*Idist;
+ return (1.0/(local_z) - 1.0/0.01)/(1.0/1000.0 -1.0/0.01);
+}
+
+// https://iquilezles.org/articles/distfunctions/
+float sdHorseshoe( in vec3 p, in vec2 c, in float r, in float le, vec2 w )
+{
+ p.x = abs(p.x);
+ float l = length(p.xy);
+ p.xy = mat2(-c.x, c.y,
+ c.y, c.x)*p.xy;
+ p.xy = vec2((p.y>0.0 || p.x>0.0)?p.x:l*sign(-c.x),
+ (p.x>0.0)?p.y:l );
+ p.xy = vec2(p.x,abs(p.y-r))-vec2(le,0.0);
+
+ vec2 q = vec2(length(max(p.xy,0.0)) + min(0.0,max(p.x,p.y)),p.z);
+ vec2 d = abs(q) - w;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+// r = sphere's radius
+// h = cutting's plane's position
+// t = thickness
+float sdSixWayCutHollowSphere( vec3 p, float r, float h, float t )
+{
+ // Six way symetry Transformation
+ vec3 ap = abs(p);
+ if(ap.x < max(ap.y, ap.z)){
+ if(ap.y < ap.z) ap.xz = ap.zx;
+ else ap.xy = ap.yx;
+ }
+
+ vec2 q = vec2( length(ap.yz), ap.x );
+
+ float w = sqrt(r*r-h*h);
+
+ return ((h*q.x<w*q.y) ? length(q-vec2(w,h)) :
+ abs(length(q)-r) ) - t;
+}
+
+// https://iquilezles.org/articles/boxfunctions
+vec2 iBox( in vec3 ro, in vec3 rd, in vec3 rad )
+{
+ vec3 m = 1.0/rd;
+ vec3 n = m*ro;
+ vec3 k = abs(m)*rad;
+ vec3 t1 = -n - k;
+ vec3 t2 = -n + k;
+ return vec2( max( max( t1.x, t1.y ), t1.z ),
+ min( min( t2.x, t2.y ), t2.z ) );
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec2 map( in vec3 pos ){
+ vec2 res = vec2( sdHorseshoe( pos-vec3(-1.0,0.08, 1.0), vec2(cos(1.3),sin(1.3)), 0.2, 0.3, vec2(0.03,0.5) ), 11.5 ) ;
+ res = opU(res, vec2( sdSixWayCutHollowSphere( pos-vec3(0.0, 1.0, 0.0), 4.0, 3.5, 0.5 ), 4.5 )) ;
+ return res;
+}
+
+// https://www.shadertoy.com/view/Xds3zN
+vec2 raycast( in vec3 ro, in vec3 rd ){
+ vec2 res = vec2(-1.0,-1.0);
+
+ float tmin = 1.0;
+ float tmax = 20.0;
+
+ // raytrace floor plane
+ float tp1 = (-ro.y)/rd.y;
+ if( tp1>0.0 )
+ {
+ tmax = min( tmax, tp1 );
+ res = vec2( tp1, 1.0 );
+ }
+
+ float t = tmin;
+ for( int i=0; i<70 ; i++ )
+ {
+ if(t>tmax) break;
+ vec2 h = map( ro+rd*t );
+ if( abs(h.x)<(0.0001*t) )
+ {
+ res = vec2(t,h.y);
+ break;
+ }
+ t += h.x;
+ }
+
+ return res;
+}
+
+
+// https://iquilezles.org/articles/rmshadows
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ // bounding volume
+ float tp = (0.8-ro.y)/rd.y; if( tp>0.0 ) tmax = min( tmax, tp );
+
+ float res = 1.0;
+ float t = mint;
+ for( int i=ZERO; i<24; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ float s = clamp(8.0*h/t,0.0,1.0);
+ res = min( res, s );
+ t += clamp( h, 0.01, 0.2 );
+ if( res<0.004 || t>tmax ) break;
+ }
+ res = clamp( res, 0.0, 1.0 );
+ return res*res*(3.0-2.0*res);
+}
+
+
+// https://iquilezles.org/articles/normalsSDF
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+}
+
+// https://iquilezles.org/articles/nvscene2008/rwwtt.pdf
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=ZERO; i<5; i++ )
+ {
+ float h = 0.01 + 0.12*float(i)/4.0;
+ float d = map( pos + h*nor ).x;
+ occ += (h-d)*sca;
+ sca *= 0.95;
+ if( occ>0.35 ) break;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ) * (0.5+0.5*nor.y);
+}
+
+// https://iquilezles.org/articles/checkerfiltering
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+// https://www.shadertoy.com/view/tdS3DG
+vec4 render( in vec3 ro, in vec3 rd)
+{
+ // background
+ vec3 col = vec3(0.7, 0.7, 0.9) - max(rd.y,0.0)*0.3;
+
+ // raycast scene
+ vec2 res = raycast(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = (m<1.5) ? vec3(0.0,1.0,0.0) : calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.2 + 0.2*sin( m*2.0 + vec3(0.0,1.0,2.0) );
+ float ks = 1.0;
+
+ if( m<1.5 )
+ {
+ float f = checkersGradBox( 3.0*pos.xz);
+ col = 0.15 + f*vec3(0.05);
+ ks = 0.4;
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+
+ vec3 lin = vec3(0.0);
+
+ // sun
+ {
+ vec3 lig = normalize( vec3(-0.5, 0.4, -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ //if( dif>0.0001 )
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0);
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0-dot(hal,lig),0.0,1.0),5.0);
+ //spe *= 0.04+0.96*pow(clamp(1.0-sqrt(0.5*(1.0-dot(rd,lig))),0.0,1.0),5.0);
+ lin += col*2.20*dif*vec3(1.30,1.00,0.70);
+ lin += 5.00*spe*vec3(1.30,1.00,0.70)*ks;
+ }
+ // sky
+ {
+ float dif = sqrt(clamp( 0.5+0.5*nor.y, 0.0, 1.0 ));
+ dif *= occ;
+ float spe = smoothstep( -0.2, 0.2, ref.y );
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0+dot(nor,rd),0.0,1.0), 5.0 );
+ //if( spe>0.001 )
+ spe *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+ lin += col*0.60*dif*vec3(0.40,0.60,1.15);
+ lin += 2.00*spe*vec3(0.40,0.60,1.30)*ks;
+ }
+ // back
+ {
+ float dif = clamp( dot( nor, normalize(vec3(0.5,0.0,0.6))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ dif *= occ;
+ lin += col*0.55*dif*vec3(0.25,0.25,0.25);
+ }
+ // sss
+ {
+ float dif = pow(clamp(1.0+dot(nor,rd),0.0,1.0),2.0);
+ dif *= occ;
+ lin += col*0.25*dif*vec3(1.00,1.00,1.00);
+ }
+
+ col = lin;
+
+ col = mix( col, vec3(0.7,0.7,0.9), 1.0-exp( -0.0001*t*t*t ) );
+ }
+
+ return vec4(vec3( clamp(col,0.0,1.0) ),t);
+}
+
+vec3 CalcRayDir(vec2 nCoord){
+ vec3 horizontal = normalize(cross(camDir,vec3(.0 , 1.0, .0)));
+ vec3 vertical = normalize(cross(horizontal,camDir));
+ return normalize(camDir + horizontal*nCoord.x + vertical*nCoord.y);
+}
+
+mat3 setCamera()
+{
+ vec3 cw = normalize(camDir);
+ vec3 cp = vec3(0.0, 1.0 ,0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = ( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec2 nCoord = (gl_FragCoord.xy - screenCenter.xy)/screenCenter.y;
+ mat3 ca = setCamera();
+
+ // focal length
+ float fl = length(camDir);
+ vec3 rd = ca * normalize( vec3(nCoord,fl) );
+ vec3 color = vec3(nCoord/2.0 + 0.5, 0.0);
+ float depth = gl_FragCoord.z;
+ {
+ vec4 res = render( camPos - vec3(0.0, 0.0, 0.0) , rd );
+ color = res.xyz;
+ depth = CalcDepth(rd,res.w);
+ }
+ gl_FragColor = vec4(color , 1.0);
+ gl_FragDepthEXT = depth;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs b/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
new file mode 100644
index 0000000..44d0834
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
@@ -0,0 +1,83 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform vec2 screenDims; // Dimensions of the screen
+uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
+uniform vec2 offset; // Offset of the scale.
+uniform float zoom; // Zoom of the scale.
+
+// NOTE: Maximum number of shader for-loop iterations depend on GPU,
+// for example, on RasperryPi for this examply only supports up to 60
+const int MAX_ITERATIONS = 48; // Max iterations to do
+
+// Square a complex number
+vec2 ComplexSquare(vec2 z)
+{
+ return vec2(
+ z.x * z.x - z.y * z.y,
+ z.x * z.y * 2.0
+ );
+}
+
+// Convert Hue Saturation Value (HSV) color into RGB
+vec3 Hsv2rgb(vec3 c)
+{
+ vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
+void main()
+{
+ /**********************************************************************************************
+ Julia sets use a function z^2 + c, where c is a constant.
+ This function is iterated until the nature of the point is determined.
+
+ If the magnitude of the number becomes greater than 2, then from that point onward
+ the number will get bigger and bigger, and will never get smaller (tends towards infinity).
+ 2^2 = 4, 4^2 = 8 and so on.
+ So at 2 we stop iterating.
+
+ If the number is below 2, we keep iterating.
+ But when do we stop iterating if the number is always below 2 (it converges)?
+ That is what MAX_ITERATIONS is for.
+ Then we can divide the iterations by the MAX_ITERATIONS value to get a normalized value that we can
+ then map to a color.
+
+ We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
+ And once the magnitude squared is > 4, then magnitude > 2 is also true (saves computational power).
+ *************************************************************************************************/
+
+ // The pixel coordinates are scaled so they are on the mandelbrot scale
+ // NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
+ vec2 z = vec2((fragTexCoord.x + offset.x/screenDims.x)*2.5/zoom, (fragTexCoord.y + offset.y/screenDims.y)*1.5/zoom);
+
+ int iter = 0;
+ for (int iterations = 0; iterations < 60; iterations++)
+ {
+ z = ComplexSquare(z) + c; // Iterate function
+ if (dot(z, z) > 4.0) break;
+
+ iter = iterations;
+ }
+
+ // Another few iterations decreases errors in the smoothing calculation.
+ // See http://linas.org/art-gallery/escape/escape.html for more information.
+ z = ComplexSquare(z) + c;
+ z = ComplexSquare(z) + c;
+
+ // This last part smooths the color (again see link above).
+ float smoothVal = float(iter) + 1.0 - (log(log(length(z)))/log(2.0));
+
+ // Normalize the value so it is between 0 and 1.
+ float norm = smoothVal/float(MAX_ITERATIONS);
+
+ // If in set, color black. 0.999 allows for some float accuracy error.
+ if (norm > 0.999) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else gl_FragColor = vec4(Hsv2rgb(vec3(norm, 1.0, 1.0)), 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
new file mode 100644
index 0000000..7367161
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
@@ -0,0 +1,81 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ gl_FragColor = pow(finalColor, vec4(1.0/2.2));
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs b/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs
new file mode 100644
index 0000000..5245c61
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs
@@ -0,0 +1,59 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalize(normalMatrix*vertexNormal);
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs b/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs
new file mode 100644
index 0000000..eb47bb9
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs
@@ -0,0 +1,36 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+attribute mat4 instanceTransform;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Compute MVP for current instance
+ mat4 mvpi = mvp*instanceTransform;
+
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(mvpi*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvpi*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/mask.fs b/raylib/examples/shaders/resources/shaders/glsl100/mask.fs
new file mode 100644
index 0000000..2071062
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/mask.fs
@@ -0,0 +1,24 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D mask;
+uniform vec4 colDiffuse;
+uniform int frame;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 maskColour = texture2D(mask, fragTexCoord + vec2(sin(-float(frame)/150.0)/10.0, cos(-float(frame)/170.0)/10.0));
+ if (maskColour.r < 0.25) discard;
+ vec4 texelColor = texture2D(texture0, fragTexCoord + vec2(sin(float(frame)/90.0)/8.0, cos(float(frame)/60.0)/8.0));
+
+ gl_FragColor = texelColor*maskColour;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/outline.fs b/raylib/examples/shaders/resources/shaders/glsl100/outline.fs
new file mode 100644
index 0000000..c64409e
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/outline.fs
@@ -0,0 +1,34 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform vec2 textureSize;
+uniform float outlineSize;
+uniform vec4 outlineColor;
+
+void main()
+{
+ vec4 texel = texture2D(texture0, fragTexCoord); // Get texel color
+ vec2 texelScale = vec2(0.0);
+ texelScale.x = outlineSize/textureSize.x;
+ texelScale.y = outlineSize/textureSize.y;
+
+ // We sample four corner texels, but only for the alpha channel (this is for the outline)
+ vec4 corners = vec4(0.0);
+ corners.x = texture2D(texture0, fragTexCoord + vec2(texelScale.x, texelScale.y)).a;
+ corners.y = texture2D(texture0, fragTexCoord + vec2(texelScale.x, -texelScale.y)).a;
+ corners.z = texture2D(texture0, fragTexCoord + vec2(-texelScale.x, texelScale.y)).a;
+ corners.w = texture2D(texture0, fragTexCoord + vec2(-texelScale.x, -texelScale.y)).a;
+
+ float outline = min(dot(corners, vec4(1.0)), 1.0);
+ vec4 color = mix(vec4(0.0), outlineColor, outline);
+ gl_FragColor = mix(color, texel, texel.a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs b/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs
new file mode 100644
index 0000000..25b4963
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs
@@ -0,0 +1,41 @@
+#version 100
+
+precision mediump float;
+
+const int colors = 8;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[colors];
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0, 1] to [0, 255].
+ int index = int(texelColor.r*255.0);
+
+ ivec3 color = ivec3(0);
+
+ // NOTE: On GLSL 100 we are not allowed to index a uniform array by a variable value,
+ // a constantmust be used, so this logic...
+ if (index == 0) color = palette[0];
+ else if (index == 1) color = palette[1];
+ else if (index == 2) color = palette[2];
+ else if (index == 3) color = palette[3];
+ else if (index == 4) color = palette[4];
+ else if (index == 5) color = palette[5];
+ else if (index == 6) color = palette[6];
+ else if (index == 7) color = palette[7];
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0, 255] and need to be normalized to [0, 1]
+ // for OpenGL to work.
+ gl_FragColor = vec4(float(color.x)/255.0, float(color.y)/255.0, float(color.z)/255.0, texelColor.a);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs b/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs
new file mode 100644
index 0000000..dae63df
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs
@@ -0,0 +1,32 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float pixelWidth = 5.0;
+float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture2D(texture0, coord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs b/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs
new file mode 100644
index 0000000..f7060e5
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs
@@ -0,0 +1,29 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord.xy).rgb;
+
+ color = pow(color, vec3(gamma, gamma, gamma));
+ color = color*numColors;
+ color = floor(color);
+ color = color/numColors;
+ color = pow(color, vec3(1.0/gamma));
+
+ gl_FragColor = vec4(color, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/predator.fs b/raylib/examples/shaders/resources/shaders/glsl100/predator.fs
new file mode 100644
index 0000000..e0c0a9d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/predator.fs
@@ -0,0 +1,31 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (color.r + color.g + color.b)/3.0;
+
+ vec3 tc = vec3(0.0, 0.0, 0.0);
+
+ if (lum < 0.5) tc = mix(colors[0], colors[1], lum/0.5);
+ else tc = mix(colors[1], colors[2], (lum - 0.5)/0.5);
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs b/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs
new file mode 100644
index 0000000..d58d9d3
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs
@@ -0,0 +1,431 @@
+#version 100
+
+precision mediump float;
+
+#extension GL_OES_standard_derivatives : enable
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform vec3 viewEye;
+uniform vec3 viewCenter;
+uniform float runTime;
+uniform vec2 resolution;
+
+// The MIT License
+// Copyright © 2013 Inigo Quilez
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// A list of useful distance function to simple primitives, and an example on how to
+// do some interesting boolean operations, repetition and displacement.
+//
+// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+
+#define AA 1 // make this 1 is your machine is too slow
+
+//------------------------------------------------------------------
+
+float sdPlane( vec3 p )
+{
+ return p.y;
+}
+
+float sdSphere( vec3 p, float s )
+{
+ return length(p)-s;
+}
+
+float sdBox( vec3 p, vec3 b )
+{
+ vec3 d = abs(p) - b;
+ return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
+}
+
+float sdEllipsoid( in vec3 p, in vec3 r )
+{
+ return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
+}
+
+float udRoundBox( vec3 p, vec3 b, float r )
+{
+ return length(max(abs(p)-b,0.0))-r;
+}
+
+float sdTorus( vec3 p, vec2 t )
+{
+ return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
+}
+
+float sdHexPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+#if 0
+ return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
+#else
+ float d1 = q.z-h.y;
+ float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+#endif
+}
+
+float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
+{
+ vec3 pa = p-a, ba = b-a;
+ float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+ return length( pa - ba*h ) - r;
+}
+
+float sdEquilateralTriangle( in vec2 p )
+{
+ const float k = sqrt(3.0);
+ p.x = abs(p.x) - 1.0;
+ p.y = p.y + 1.0/k;
+ if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
+ p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
+ return -length(p)*sign(p.y);
+}
+
+float sdTriPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+ float d1 = q.z-h.y;
+#if 1
+ // distance bound
+ float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
+#else
+ // correct distance
+ h.x *= 0.866025;
+ float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
+#endif
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdCylinder( vec3 p, vec2 h )
+{
+ vec2 d = abs(vec2(length(p.xz),p.y)) - h;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+float sdCone( in vec3 p, in vec3 c )
+{
+ vec2 q = vec2( length(p.xz), p.y );
+ float d1 = -q.y-c.z;
+ float d2 = max( dot(q,c.xy), q.y);
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
+{
+ float d1 = -p.y - h;
+ float q = p.y - h;
+ float si = 0.5*(r1-r2)/h;
+ float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
+{
+ // Tetrahedron = Octahedron - Cube
+ float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
+
+ float d = 0.0;
+ d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
+ float octa = d - h.z;
+ return max(-box,octa); // Subtraction
+ }
+
+float length2( vec2 p )
+{
+ return sqrt( p.x*p.x + p.y*p.y );
+}
+
+float length6( vec2 p )
+{
+ p = p*p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/6.0 );
+}
+
+float length8( vec2 p )
+{
+ p = p*p; p = p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/8.0 );
+}
+
+float sdTorus82( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length2(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdTorus88( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length8(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdCylinder6( vec3 p, vec2 h )
+{
+ return max( length6(p.xz)-h.x, abs(p.y)-h.y );
+}
+
+//------------------------------------------------------------------
+
+float opS( float d1, float d2 )
+{
+ return max(-d2,d1);
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec3 opRep( vec3 p, vec3 c )
+{
+ return mod(p,c)-0.5*c;
+}
+
+vec3 opTwist( vec3 p )
+{
+ float c = cos(10.0*p.y+10.0);
+ float s = sin(10.0*p.y+10.0);
+ mat2 m = mat2(c,-s,s,c);
+ return vec3(m*p.xz,p.y);
+}
+
+//------------------------------------------------------------------
+
+vec2 map( in vec3 pos )
+{
+ vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
+ vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
+ res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
+ res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
+ res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
+ res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
+ res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
+ res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
+ res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
+ res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
+ res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
+ res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
+ res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
+ res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
+ res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
+ sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
+ res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
+ sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
+ res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
+ res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
+ res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
+ res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
+
+ return res;
+}
+
+vec2 castRay( in vec3 ro, in vec3 rd )
+{
+ float tmin = 0.2;
+ float tmax = 30.0;
+
+#if 1
+ // bounding volume
+ float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
+ float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
+ else tmax = min( tmax, tp2 ); }
+#endif
+
+ float t = tmin;
+ float m = -1.0;
+ for( int i=0; i<64; i++ )
+ {
+ float precis = 0.0005*t;
+ vec2 res = map( ro+rd*t );
+ if( res.x<precis || t>tmax ) break;
+ t += res.x;
+ m = res.y;
+ }
+
+ if( t>tmax ) m=-1.0;
+ return vec2( t, m );
+}
+
+
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ float res = 1.0;
+ float t = mint;
+ for( int i=0; i<16; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ res = min( res, 8.0*h/t );
+ t += clamp( h, 0.02, 0.10 );
+ if( h<0.001 || t>tmax ) break;
+ }
+ return clamp( res, 0.0, 1.0 );
+}
+
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+ /*
+ vec3 eps = vec3( 0.0005, 0.0, 0.0 );
+ vec3 nor = vec3(
+ map(pos+eps.xyy).x - map(pos-eps.xyy).x,
+ map(pos+eps.yxy).x - map(pos-eps.yxy).x,
+ map(pos+eps.yyx).x - map(pos-eps.yyx).x );
+ return normalize(nor);
+ */
+}
+
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=0; i<5; i++ )
+ {
+ float hr = 0.01 + 0.12*float(i)/4.0;
+ vec3 aopos = nor * hr + pos;
+ float dd = map( aopos ).x;
+ occ += -(dd-hr)*sca;
+ sca *= 0.95;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
+}
+
+// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+vec3 render( in vec3 ro, in vec3 rd )
+{
+ vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
+ vec2 res = castRay(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
+ if( m<1.5 )
+ {
+
+ float f = checkersGradBox( 5.0*pos.xz );
+ col = 0.3 + f*vec3(0.1);
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+ vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ float dom = smoothstep( -0.1, 0.1, ref.y );
+ float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
+
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
+ dif *
+ (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
+
+ vec3 lin = vec3(0.0);
+ lin += 1.30*dif*vec3(1.00,0.80,0.55);
+ lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
+ lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
+ col = col*lin;
+ col += 10.00*spe*vec3(1.00,0.90,0.70);
+
+ col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
+ }
+
+ return vec3( clamp(col,0.0,1.0) );
+}
+
+mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
+{
+ vec3 cw = normalize(ta-ro);
+ vec3 cp = vec3(sin(cr), cos(cr),0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = normalize( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec3 tot = vec3(0.0);
+#if AA>1
+ for( int m=0; m<AA; m++ )
+ for( int n=0; n<AA; n++ )
+ {
+ // pixel coordinates
+ vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
+ vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
+#else
+ vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
+#endif
+
+ // RAY: Camera is provided from raylib
+ //vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
+
+ vec3 ro = viewEye;
+ vec3 ta = viewCenter;
+
+ // camera-to-world transformation
+ mat3 ca = setCamera( ro, ta, 0.0 );
+ // ray direction
+ vec3 rd = ca * normalize( vec3(p.xy,2.0) );
+
+ // render
+ vec3 col = render( ro, rd );
+
+ // gamma
+ col = pow( col, vec3(0.4545) );
+
+ tot += col;
+#if AA>1
+ }
+ tot /= float(AA*AA);
+#endif
+
+ gl_FragColor = vec4( tot, 1.0 );
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/reload.fs b/raylib/examples/shaders/resources/shaders/glsl100/reload.fs
new file mode 100644
index 0000000..d8e4416
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/reload.fs
@@ -0,0 +1,39 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord; // Texture coordinates (sampler2D)
+varying vec4 fragColor; // Tint color
+
+// Uniform inputs
+uniform vec2 resolution; // Viewport resolution (in pixels)
+uniform vec2 mouse; // Mouse pixel xy coordinates
+uniform float time; // Total run time (in secods)
+
+// Draw circle
+vec4 DrawCircle(vec2 fragCoord, vec2 position, float radius, vec3 color)
+{
+ float d = length(position - fragCoord) - radius;
+ float t = clamp(d, 0.0, 1.0);
+ return vec4(color, 1.0 - t);
+}
+
+void main()
+{
+ vec2 fragCoord = gl_FragCoord.xy;
+ vec2 position = vec2(mouse.x, resolution.y - mouse.y);
+ float radius = 40.0;
+
+ // Draw background layer
+ vec4 colorA = vec4(0.2,0.2,0.8, 1.0);
+ vec4 colorB = vec4(1.0,0.7,0.2, 1.0);
+ vec4 layer1 = mix(colorA, colorB, abs(sin(time*0.1)));
+
+ // Draw circle layer
+ vec3 color = vec3(0.9, 0.16, 0.21);
+ vec4 layer2 = DrawCircle(fragCoord, position, radius, color);
+
+ // Blend the two layers
+ gl_FragColor = mix(layer1, layer2, layer2.a);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs b/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs
new file mode 100644
index 0000000..74c9c31
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs
@@ -0,0 +1,44 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float offset = 0.0;
+float frequency = 450.0/3.0;
+
+uniform float time;
+
+void main()
+{
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = mix(vec4(0.0, 0.3, 0.0, 0.0), color, wavePos);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs b/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs
new file mode 100644
index 0000000..6468b09
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs
@@ -0,0 +1,40 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+vec2 resolution = vec2(800.0, 450.0);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ gl_FragColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs b/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs
new file mode 100644
index 0000000..a563421
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs
@@ -0,0 +1,77 @@
+#version 100
+
+precision mediump float;
+
+#define MAX_SPOTS 3
+
+struct Spot {
+ vec2 pos; // window coords of spot
+ float inner; // inner fully transparent centre radius
+ float radius; // alpha fades out to this radius
+};
+
+uniform Spot spots[MAX_SPOTS]; // Spotlight positions array
+uniform float screenWidth; // Width of the screen
+
+void main()
+{
+ float alpha = 1.0;
+
+ // Get the position of the current fragment (screen coordinates!)
+ vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y);
+
+ // Find out which spotlight is nearest
+ float d = 65000.0; // some high value
+ int fi = -1; // found index
+
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ for (int j = 0; j < MAX_SPOTS; j++)
+ {
+ float dj = distance(pos, spots[j].pos) - spots[j].radius + spots[i].radius;
+
+ if (d > dj)
+ {
+ d = dj;
+ fi = i;
+ }
+ }
+ }
+
+ // d now equals distance to nearest spot...
+ // allowing for the different radii of all spotlights
+ if (fi == 0)
+ {
+ if (d > spots[0].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[0].inner) alpha = 0.0;
+ else alpha = (d - spots[0].inner)/(spots[0].radius - spots[0].inner);
+ }
+ }
+ else if (fi == 1)
+ {
+ if (d > spots[1].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[1].inner) alpha = 0.0;
+ else alpha = (d - spots[1].inner)/(spots[1].radius - spots[1].inner);
+ }
+ }
+ else if (fi == 2)
+ {
+ if (d > spots[2].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[2].inner) alpha = 0.0;
+ else alpha = (d - spots[2].inner)/(spots[2].radius - spots[2].inner);
+ }
+ }
+
+ // Right hand side of screen is dimly lit,
+ // could make the threshold value user definable
+ if ((pos.x > screenWidth/2.0) && (alpha > 0.9)) alpha = 0.9;
+
+ // could make the black out colour user definable...
+ gl_FragColor = vec4(0, 0, 0, alpha);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs b/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
new file mode 100644
index 0000000..ec6c664
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
@@ -0,0 +1,46 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center;
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ gl_FragColor = vec4(color.rgb, 1.0);;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/wave.fs b/raylib/examples/shaders/resources/shaders/glsl100/wave.fs
new file mode 100644
index 0000000..cd4ba9d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/wave.fs
@@ -0,0 +1,36 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform float seconds;
+
+uniform vec2 size;
+
+uniform float freqX;
+uniform float freqY;
+uniform float ampX;
+uniform float ampY;
+uniform float speedX;
+uniform float speedY;
+
+void main() {
+ float pixelWidth = 1.0 / size.x;
+ float pixelHeight = 1.0 / size.y;
+ float aspect = pixelHeight / pixelWidth;
+ float boxLeft = 0.0;
+ float boxTop = 0.0;
+
+ vec2 p = fragTexCoord;
+ p.x += cos((fragTexCoord.y - boxTop) * freqX / ( pixelWidth * 750.0) + (seconds * speedX)) * ampX * pixelWidth;
+ p.y += sin((fragTexCoord.x - boxLeft) * freqY * aspect / ( pixelHeight * 750.0) + (seconds * speedY)) * ampY * pixelHeight;
+
+ gl_FragColor = texture2D(texture0, p)*colDiffuse*fragColor;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs b/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs
new file mode 100644
index 0000000..341c611
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs
@@ -0,0 +1,17 @@
+#version 100
+#extension GL_EXT_frag_depth : enable
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepthEXT = 1.0 - gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/base.fs b/raylib/examples/shaders/resources/shaders/glsl120/base.fs
new file mode 100644
index 0000000..50781ad
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/base.fs
@@ -0,0 +1,22 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+uniform vec2 resolution = vec2(800, 450);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ gl_FragColor = texelColor*colDiffuse;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/base.vs b/raylib/examples/shaders/resources/shaders/glsl120/base.vs
new file mode 100644
index 0000000..08a61e3
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/base.vs
@@ -0,0 +1,26 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs b/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs
new file mode 100644
index 0000000..b8c4495
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs
@@ -0,0 +1,37 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // Framebuffer size
+const float samples = 5.0; // Pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // Defines size factor: Lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture2D(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/blur.fs b/raylib/examples/shaders/resources/shaders/glsl120/blur.fs
new file mode 100644
index 0000000..cf66d87
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/blur.fs
@@ -0,0 +1,32 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+vec3 offset = vec3(0.0, 1.3846153846, 3.2307692308);
+vec3 weight = vec3(0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 tc = texture2D(texture0, fragTexCoord).rgb*weight.x;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs b/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs
new file mode 100644
index 0000000..14b7e2e
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs
@@ -0,0 +1,45 @@
+# version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture2D(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord .x + gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs b/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs
new file mode 100644
index 0000000..0e0cb7c
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs
@@ -0,0 +1,55 @@
+# version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs b/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs
new file mode 100644
index 0000000..cf73981
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs
@@ -0,0 +1,52 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture2D(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture2D(texture0, tcRed).r;
+
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs b/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs
new file mode 100644
index 0000000..cb97b2b
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs
@@ -0,0 +1,35 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color += texture2D(texture0, fragTexCoord + 0.001);
+ color += texture2D(texture0, fragTexCoord + 0.003);
+ color += texture2D(texture0, fragTexCoord + 0.005);
+ color += texture2D(texture0, fragTexCoord + 0.007);
+ color += texture2D(texture0, fragTexCoord + 0.009);
+ color += texture2D(texture0, fragTexCoord + 0.011);
+
+ color += texture2D(texture0, fragTexCoord - 0.001);
+ color += texture2D(texture0, fragTexCoord - 0.003);
+ color += texture2D(texture0, fragTexCoord - 0.005);
+ color += texture2D(texture0, fragTexCoord - 0.007);
+ color += texture2D(texture0, fragTexCoord - 0.009);
+ color += texture2D(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ gl_FragColor = color;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs b/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs
new file mode 100644
index 0000000..5cc57f0
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs
@@ -0,0 +1,41 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0.0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ gl_FragColor = texture2D(texture0, uv);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/fog.fs b/raylib/examples/shaders/resources/shaders/glsl120/fog.fs
new file mode 100644
index 0000000..63af6c4
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/fog.fs
@@ -0,0 +1,92 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ gl_FragColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs b/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs
new file mode 100644
index 0000000..de48f6b
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs
@@ -0,0 +1,23 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
new file mode 100644
index 0000000..d9cfb44
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
@@ -0,0 +1,79 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ gl_FragColor = pow(finalColor, vec4(1.0/2.2));
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs b/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs
new file mode 100644
index 0000000..b114093
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs
@@ -0,0 +1,59 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalize(normalMatrix*vertexNormal);
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs b/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs
new file mode 100644
index 0000000..ab3f79c
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs
@@ -0,0 +1,27 @@
+#version 120
+
+const int colors = 8;
+
+// Input fragment attributes (from fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[colors];
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord) * fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0, 1] to [0, 255].
+ int index = int(texelColor.r * 255.0);
+ ivec3 color = palette[index];
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0, 255] and need to be normalized to [0, 1]
+ // for OpenGL to work.
+ gl_FragColor = vec4(color / 255.0, texelColor.a);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs b/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs
new file mode 100644
index 0000000..8f5e4f1
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs
@@ -0,0 +1,30 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float pixelWidth = 5.0;
+float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture2D(texture0, coord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs b/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs
new file mode 100644
index 0000000..445c925
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs
@@ -0,0 +1,27 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord.xy).rgb;
+
+ color = pow(color, vec3(gamma, gamma, gamma));
+ color = color*numColors;
+ color = floor(color);
+ color = color/numColors;
+ color = pow(color, vec3(1.0/gamma));
+
+ gl_FragColor = vec4(color, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/predator.fs b/raylib/examples/shaders/resources/shaders/glsl120/predator.fs
new file mode 100644
index 0000000..2198696
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/predator.fs
@@ -0,0 +1,29 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (color.r + color.g + color.b)/3.0;
+
+ vec3 tc = vec3(0.0, 0.0, 0.0);
+
+ if (lum < 0.5) tc = mix(colors[0], colors[1], lum/0.5);
+ else tc = mix(colors[1], colors[2], (lum - 0.5)/0.5);
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs b/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs
new file mode 100644
index 0000000..520daa5
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs
@@ -0,0 +1,42 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float offset = 0.0;
+float frequency = 450.0/3.0;
+
+uniform float time;
+
+void main()
+{
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = mix(vec4(0.0, 0.3, 0.0, 0.0), color, wavePos);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs b/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs
new file mode 100644
index 0000000..8c74a6a
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs
@@ -0,0 +1,38 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+vec2 resolution = vec2(800.0, 450.0);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ gl_FragColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs b/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs
new file mode 100644
index 0000000..7b3dd2f
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs
@@ -0,0 +1,44 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center;
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ gl_FragColor = vec4(color.rgb, 1.0);;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/base.fs b/raylib/examples/shaders/resources/shaders/glsl330/base.fs
new file mode 100644
index 0000000..6b50062
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/base.fs
@@ -0,0 +1,25 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ finalColor = texelColor*colDiffuse;
+}
+
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/base.vs b/raylib/examples/shaders/resources/shaders/glsl330/base.vs
new file mode 100644
index 0000000..8cc2abb
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/base.vs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+out vec2 fragTexCoord;
+out vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs b/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs
new file mode 100644
index 0000000..56eadb5
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs
@@ -0,0 +1,40 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // Framebuffer size
+const float samples = 5.0; // Pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // Defines size factor: Lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ finalColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/blur.fs b/raylib/examples/shaders/resources/shaders/glsl330/blur.fs
new file mode 100644
index 0000000..8809f71
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/blur.fs
@@ -0,0 +1,35 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float offset[3] = float[](0.0, 1.3846153846, 3.2307692308);
+float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord).rgb*weight[0];
+
+ for (int i = 1; i < 3; i++)
+ {
+ texelColor += texture(texture0, fragTexCoord + vec2(offset[i])/renderWidth, 0.0).rgb*weight[i];
+ texelColor += texture(texture0, fragTexCoord - vec2(offset[i])/renderWidth, 0.0).rgb*weight[i];
+ }
+
+ finalColor = vec4(texelColor, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs b/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs
new file mode 100644
index 0000000..e794d32
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs
@@ -0,0 +1,27 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec3 vertexPos;
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+uniform vec4 colDiffuse;
+
+uniform float divider = 0.5;
+
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor0 = texture(texture0, fragTexCoord);
+ vec4 texelColor1 = texture(texture1, fragTexCoord);
+
+ float x = fract(fragTexCoord.s);
+ float final = smoothstep(divider - 0.1, divider + 0.1, x);
+
+ finalColor = mix(texelColor0, texelColor1, final);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs b/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs
new file mode 100644
index 0000000..276eabd
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs
@@ -0,0 +1,48 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord.x - gl_FragCoord.y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs b/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs
new file mode 100644
index 0000000..02be861
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs
@@ -0,0 +1,59 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+
+uniform int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs b/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs
new file mode 100644
index 0000000..1d75e4e
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs
@@ -0,0 +1,61 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Custom variables
+#define PI 3.14159265358979323846
+uniform float uTime = 0.0;
+
+float divisions = 5.0;
+float angle = 0.0;
+
+vec2 VectorRotateTime(vec2 v, float speed)
+{
+ float time = uTime*speed;
+ float localTime = fract(time); // The time domain this works on is 1 sec.
+
+ if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0;
+ else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4*sin(2*PI*localTime - PI/2);
+ else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25;
+ else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4*sin(2*PI*localTime);
+
+ // Rotate vector by angle
+ v -= 0.5;
+ v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v;
+ v += 0.5;
+
+ return v;
+}
+
+float Rectangle(in vec2 st, in float size, in float fill)
+{
+ float roundSize = 0.5 - size/2.0;
+ float left = step(roundSize, st.x);
+ float top = step(roundSize, st.y);
+ float bottom = step(roundSize, 1.0 - st.y);
+ float right = step(roundSize, 1.0 - st.x);
+
+ return (left*bottom*right*top)*fill;
+}
+
+void main()
+{
+ vec2 fragPos = fragTexCoord;
+ fragPos.xy += uTime/9.0;
+
+ fragPos *= divisions;
+ vec2 ipos = floor(fragPos); // Get the integer coords
+ vec2 fpos = fract(fragPos); // Get the fractional coords
+
+ fpos = VectorRotateTime(fpos, 0.2);
+
+ float alpha = Rectangle(fpos, 0.216, 1.0);
+ vec3 color = vec3(0.3, 0.3, 0.3);
+
+ finalColor = vec4(color, alpha);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/depth.fs b/raylib/examples/shaders/resources/shaders/glsl330/depth.fs
new file mode 100644
index 0000000..f7546bb
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/depth.fs
@@ -0,0 +1,27 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0; // Depth texture
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ float zNear = 0.01; // camera z near
+ float zFar = 10.0; // camera z far
+ float z = texture(texture0, fragTexCoord).x;
+
+ // Linearize depth value
+ float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+
+ // Calculate final fragment color
+ finalColor = vec4(depth, depth, depth, 1.0f);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs b/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs
new file mode 100644
index 0000000..43d540d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs
@@ -0,0 +1,56 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture(texture0, tcRed).r;
+
+ finalColor = vec4(red, green, blue, 1.0);
+ }
+}
+
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs b/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs
new file mode 100644
index 0000000..31d3fd2
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs
@@ -0,0 +1,34 @@
+#version 330
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture(texture0, fragTexCoord);
+
+ color += texture(texture0, fragTexCoord + 0.001);
+ color += texture(texture0, fragTexCoord + 0.003);
+ color += texture(texture0, fragTexCoord + 0.005);
+ color += texture(texture0, fragTexCoord + 0.007);
+ color += texture(texture0, fragTexCoord + 0.009);
+ color += texture(texture0, fragTexCoord + 0.011);
+
+ color += texture(texture0, fragTexCoord - 0.001);
+ color += texture(texture0, fragTexCoord - 0.003);
+ color += texture(texture0, fragTexCoord - 0.005);
+ color += texture(texture0, fragTexCoord - 0.007);
+ color += texture(texture0, fragTexCoord - 0.009);
+ color += texture(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ fragColor = color;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs b/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs
new file mode 100644
index 0000000..644e38d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs
@@ -0,0 +1,59 @@
+#version 330
+
+/*************************************************************************************
+
+ The Sieve of Eratosthenes -- a simple shader by ProfJski
+ An early prime number sieve: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
+
+ The screen is divided into a square grid of boxes, each representing an integer value.
+ Each integer is tested to see if it is a prime number. Primes are colored white.
+ Non-primes are colored with a color that indicates the smallest factor which evenly divdes our integer.
+
+ You can change the scale variable to make a larger or smaller grid.
+ Total number of integers displayed = scale squared, so scale = 100 tests the first 10,000 integers.
+
+ WARNING: If you make scale too large, your GPU may bog down!
+
+***************************************************************************************/
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Make a nice spectrum of colors based on counter and maxSize
+vec4 Colorizer(float counter, float maxSize)
+{
+ float red = 0.0, green = 0.0, blue = 0.0;
+ float normsize = counter/maxSize;
+
+ red = smoothstep(0.3, 0.7, normsize);
+ green = sin(3.14159*normsize);
+ blue = 1.0 - smoothstep(0.0, 0.4, normsize);
+
+ return vec4(0.8*red, 0.8*green, 0.8*blue, 1.0);
+}
+
+void main()
+{
+ vec4 color = vec4(1.0);
+ float scale = 1000.0; // Makes 100x100 square grid. Change this variable to make a smaller or larger grid.
+ int value = int(scale*floor(fragTexCoord.y*scale)+floor(fragTexCoord.x*scale)); // Group pixels into boxes representing integer values
+
+ if ((value == 0) || (value == 1) || (value == 2)) finalColor = vec4(1.0);
+ else
+ {
+ for (int i = 2; (i < max(2, sqrt(value) + 1)); i++)
+ {
+ if ((value - i*floor(float(value)/float(i))) == 0)
+ {
+ color = Colorizer(float(i), scale);
+ //break; // Uncomment to color by the largest factor instead
+ }
+ }
+
+ finalColor = color;
+ }
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs b/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs
new file mode 100644
index 0000000..bb03a61
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs
@@ -0,0 +1,40 @@
+#version 330
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ fragColor = texture(texture0, uv);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/fog.fs b/raylib/examples/shaders/resources/shaders/glsl330/fog.fs
new file mode 100644
index 0000000..445cca3
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/fog.fs
@@ -0,0 +1,95 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+in vec3 fragPosition;
+in vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ finalColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs b/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs
new file mode 100644
index 0000000..dead6ec
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ finalColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs b/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs
new file mode 100644
index 0000000..85ef492
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs
@@ -0,0 +1,14 @@
+#version 330
+
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepth = gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs b/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs
new file mode 100644
index 0000000..5b66dd7
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs
@@ -0,0 +1,284 @@
+# version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Custom Input Uniform
+uniform vec3 camPos;
+uniform vec3 camDir;
+uniform vec2 screenCenter;
+
+#define ZERO 0
+
+// https://learnopengl.com/Advanced-OpenGL/Depth-testing
+float CalcDepth(in vec3 rd, in float Idist){
+ float local_z = dot(normalize(camDir),rd)*Idist;
+ return (1.0/(local_z) - 1.0/0.01)/(1.0/1000.0 -1.0/0.01);
+}
+
+// https://iquilezles.org/articles/distfunctions/
+float sdHorseshoe( in vec3 p, in vec2 c, in float r, in float le, vec2 w )
+{
+ p.x = abs(p.x);
+ float l = length(p.xy);
+ p.xy = mat2(-c.x, c.y,
+ c.y, c.x)*p.xy;
+ p.xy = vec2((p.y>0.0 || p.x>0.0)?p.x:l*sign(-c.x),
+ (p.x>0.0)?p.y:l );
+ p.xy = vec2(p.x,abs(p.y-r))-vec2(le,0.0);
+
+ vec2 q = vec2(length(max(p.xy,0.0)) + min(0.0,max(p.x,p.y)),p.z);
+ vec2 d = abs(q) - w;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+// r = sphere's radius
+// h = cutting's plane's position
+// t = thickness
+float sdSixWayCutHollowSphere( vec3 p, float r, float h, float t )
+{
+ // Six way symetry Transformation
+ vec3 ap = abs(p);
+ if(ap.x < max(ap.y, ap.z)){
+ if(ap.y < ap.z) ap.xz = ap.zx;
+ else ap.xy = ap.yx;
+ }
+
+ vec2 q = vec2( length(ap.yz), ap.x );
+
+ float w = sqrt(r*r-h*h);
+
+ return ((h*q.x<w*q.y) ? length(q-vec2(w,h)) :
+ abs(length(q)-r) ) - t;
+}
+
+// https://iquilezles.org/articles/boxfunctions
+vec2 iBox( in vec3 ro, in vec3 rd, in vec3 rad )
+{
+ vec3 m = 1.0/rd;
+ vec3 n = m*ro;
+ vec3 k = abs(m)*rad;
+ vec3 t1 = -n - k;
+ vec3 t2 = -n + k;
+ return vec2( max( max( t1.x, t1.y ), t1.z ),
+ min( min( t2.x, t2.y ), t2.z ) );
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec2 map( in vec3 pos ){
+ vec2 res = vec2( sdHorseshoe( pos-vec3(-1.0,0.08, 1.0), vec2(cos(1.3),sin(1.3)), 0.2, 0.3, vec2(0.03,0.5) ), 11.5 ) ;
+ res = opU(res, vec2( sdSixWayCutHollowSphere( pos-vec3(0.0, 1.0, 0.0), 4.0, 3.5, 0.5 ), 4.5 )) ;
+ return res;
+}
+
+// https://www.shadertoy.com/view/Xds3zN
+vec2 raycast( in vec3 ro, in vec3 rd ){
+ vec2 res = vec2(-1.0,-1.0);
+
+ float tmin = 1.0;
+ float tmax = 20.0;
+
+ // raytrace floor plane
+ float tp1 = (-ro.y)/rd.y;
+ if( tp1>0.0 )
+ {
+ tmax = min( tmax, tp1 );
+ res = vec2( tp1, 1.0 );
+ }
+
+ float t = tmin;
+ for( int i=0; i<70 ; i++ )
+ {
+ if(t>tmax) break;
+ vec2 h = map( ro+rd*t );
+ if( abs(h.x)<(0.0001*t) )
+ {
+ res = vec2(t,h.y);
+ break;
+ }
+ t += h.x;
+ }
+
+ return res;
+}
+
+
+// https://iquilezles.org/articles/rmshadows
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ // bounding volume
+ float tp = (0.8-ro.y)/rd.y; if( tp>0.0 ) tmax = min( tmax, tp );
+
+ float res = 1.0;
+ float t = mint;
+ for( int i=ZERO; i<24; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ float s = clamp(8.0*h/t,0.0,1.0);
+ res = min( res, s );
+ t += clamp( h, 0.01, 0.2 );
+ if( res<0.004 || t>tmax ) break;
+ }
+ res = clamp( res, 0.0, 1.0 );
+ return res*res*(3.0-2.0*res);
+}
+
+
+// https://iquilezles.org/articles/normalsSDF
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+}
+
+// https://iquilezles.org/articles/nvscene2008/rwwtt.pdf
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=ZERO; i<5; i++ )
+ {
+ float h = 0.01 + 0.12*float(i)/4.0;
+ float d = map( pos + h*nor ).x;
+ occ += (h-d)*sca;
+ sca *= 0.95;
+ if( occ>0.35 ) break;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ) * (0.5+0.5*nor.y);
+}
+
+// https://iquilezles.org/articles/checkerfiltering
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+// https://www.shadertoy.com/view/tdS3DG
+vec4 render( in vec3 ro, in vec3 rd)
+{
+ // background
+ vec3 col = vec3(0.7, 0.7, 0.9) - max(rd.y,0.0)*0.3;
+
+ // raycast scene
+ vec2 res = raycast(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = (m<1.5) ? vec3(0.0,1.0,0.0) : calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.2 + 0.2*sin( m*2.0 + vec3(0.0,1.0,2.0) );
+ float ks = 1.0;
+
+ if( m<1.5 )
+ {
+ float f = checkersGradBox( 3.0*pos.xz);
+ col = 0.15 + f*vec3(0.05);
+ ks = 0.4;
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+
+ vec3 lin = vec3(0.0);
+
+ // sun
+ {
+ vec3 lig = normalize( vec3(-0.5, 0.4, -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ //if( dif>0.0001 )
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0);
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0-dot(hal,lig),0.0,1.0),5.0);
+ //spe *= 0.04+0.96*pow(clamp(1.0-sqrt(0.5*(1.0-dot(rd,lig))),0.0,1.0),5.0);
+ lin += col*2.20*dif*vec3(1.30,1.00,0.70);
+ lin += 5.00*spe*vec3(1.30,1.00,0.70)*ks;
+ }
+ // sky
+ {
+ float dif = sqrt(clamp( 0.5+0.5*nor.y, 0.0, 1.0 ));
+ dif *= occ;
+ float spe = smoothstep( -0.2, 0.2, ref.y );
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0+dot(nor,rd),0.0,1.0), 5.0 );
+ //if( spe>0.001 )
+ spe *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+ lin += col*0.60*dif*vec3(0.40,0.60,1.15);
+ lin += 2.00*spe*vec3(0.40,0.60,1.30)*ks;
+ }
+ // back
+ {
+ float dif = clamp( dot( nor, normalize(vec3(0.5,0.0,0.6))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ dif *= occ;
+ lin += col*0.55*dif*vec3(0.25,0.25,0.25);
+ }
+ // sss
+ {
+ float dif = pow(clamp(1.0+dot(nor,rd),0.0,1.0),2.0);
+ dif *= occ;
+ lin += col*0.25*dif*vec3(1.00,1.00,1.00);
+ }
+
+ col = lin;
+
+ col = mix( col, vec3(0.7,0.7,0.9), 1.0-exp( -0.0001*t*t*t ) );
+ }
+
+ return vec4(vec3( clamp(col,0.0,1.0) ),t);
+}
+
+vec3 CalcRayDir(vec2 nCoord){
+ vec3 horizontal = normalize(cross(camDir,vec3(.0 , 1.0, .0)));
+ vec3 vertical = normalize(cross(horizontal,camDir));
+ return normalize(camDir + horizontal*nCoord.x + vertical*nCoord.y);
+}
+
+mat3 setCamera()
+{
+ vec3 cw = normalize(camDir);
+ vec3 cp = vec3(0.0, 1.0 ,0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = ( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec2 nCoord = (gl_FragCoord.xy - screenCenter.xy)/screenCenter.y;
+ mat3 ca = setCamera();
+
+ // focal length
+ float fl = length(camDir);
+ vec3 rd = ca * normalize( vec3(nCoord,fl) );
+ vec3 color = vec3(nCoord/2.0 + 0.5, 0.0);
+ float depth = gl_FragCoord.z;
+ {
+ vec4 res = render( camPos - vec3(0.0, 0.0, 0.0) , rd );
+ color = res.xyz;
+ depth = CalcDepth(rd,res.w);
+ }
+ gl_FragColor = vec4(color , 1.0);
+ gl_FragDepth = depth;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs b/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
new file mode 100644
index 0000000..c5ee0da
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
@@ -0,0 +1,81 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform vec2 screenDims; // Dimensions of the screen
+uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
+uniform vec2 offset; // Offset of the scale.
+uniform float zoom; // Zoom of the scale.
+
+const int MAX_ITERATIONS = 255; // Max iterations to do.
+
+// Square a complex number
+vec2 ComplexSquare(vec2 z)
+{
+ return vec2(
+ z.x * z.x - z.y * z.y,
+ z.x * z.y * 2.0
+ );
+}
+
+// Convert Hue Saturation Value (HSV) color into RGB
+vec3 Hsv2rgb(vec3 c)
+{
+ vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
+void main()
+{
+ /**********************************************************************************************
+ Julia sets use a function z^2 + c, where c is a constant.
+ This function is iterated until the nature of the point is determined.
+
+ If the magnitude of the number becomes greater than 2, then from that point onward
+ the number will get bigger and bigger, and will never get smaller (tends towards infinity).
+ 2^2 = 4, 4^2 = 8 and so on.
+ So at 2 we stop iterating.
+
+ If the number is below 2, we keep iterating.
+ But when do we stop iterating if the number is always below 2 (it converges)?
+ That is what MAX_ITERATIONS is for.
+ Then we can divide the iterations by the MAX_ITERATIONS value to get a normalized value that we can
+ then map to a color.
+
+ We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
+ And once the magnitude squared is > 4, then magnitude > 2 is also true (saves computational power).
+ *************************************************************************************************/
+
+ // The pixel coordinates are scaled so they are on the mandelbrot scale
+ // NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
+ vec2 z = vec2((fragTexCoord.x + offset.x/screenDims.x)*2.5/zoom, (fragTexCoord.y + offset.y/screenDims.y)*1.5/zoom);
+
+ int iterations = 0;
+ for (iterations = 0; iterations < MAX_ITERATIONS; iterations++)
+ {
+ z = ComplexSquare(z) + c; // Iterate function
+
+ if (dot(z, z) > 4.0) break;
+ }
+
+ // Another few iterations decreases errors in the smoothing calculation.
+ // See http://linas.org/art-gallery/escape/escape.html for more information.
+ z = ComplexSquare(z) + c;
+ z = ComplexSquare(z) + c;
+
+ // This last part smooths the color (again see link above).
+ float smoothVal = float(iterations) + 1.0 - (log(log(length(z)))/log(2.0));
+
+ // Normalize the value so it is between 0 and 1.
+ float norm = smoothVal/float(MAX_ITERATIONS);
+
+ // If in set, color black. 0.999 allows for some float accuracy error.
+ if (norm > 0.999) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else finalColor = vec4(Hsv2rgb(vec3(norm, 1.0, 1.0)), 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
new file mode 100644
index 0000000..58845c8
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
@@ -0,0 +1,82 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+//in vec4 fragColor;
+in vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0)*colDiffuse;
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs b/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs
new file mode 100644
index 0000000..f8ec45f
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs
@@ -0,0 +1,32 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs b/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs
new file mode 100644
index 0000000..6775a2e
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs
@@ -0,0 +1,36 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+//in vec4 vertexColor; // Not required
+
+in mat4 instanceTransform;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Compute MVP for current instance
+ mat4 mvpi = mvp*instanceTransform;
+
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(mvpi*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ //fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvpi*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs b/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs
new file mode 100644
index 0000000..827473d
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs
@@ -0,0 +1,23 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec2 fragTexCoord2;
+in vec3 fragPosition;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec4 texelColor2 = texture(texture1, fragTexCoord2);
+
+ finalColor = texelColor * texelColor2;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs b/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs
new file mode 100644
index 0000000..d92c2f0
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs
@@ -0,0 +1,29 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec2 vertexTexCoord2;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec2 fragTexCoord2;
+out vec4 fragColor;
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragTexCoord2 = vertexTexCoord2;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/mask.fs b/raylib/examples/shaders/resources/shaders/glsl330/mask.fs
new file mode 100644
index 0000000..a93bed0
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/mask.fs
@@ -0,0 +1,22 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D mask;
+uniform int frame;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 maskColour = texture(mask, fragTexCoord + vec2(sin(-frame/150.0)/10.0, cos(-frame/170.0)/10.0));
+ if (maskColour.r < 0.25) discard;
+ vec4 texelColor = texture(texture0, fragTexCoord + vec2(sin(frame/90.0)/8.0, cos(frame/60.0)/8.0));
+
+ finalColor = texelColor*maskColour;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/outline.fs b/raylib/examples/shaders/resources/shaders/glsl330/outline.fs
new file mode 100644
index 0000000..2584a21
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/outline.fs
@@ -0,0 +1,35 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform vec2 textureSize;
+uniform float outlineSize;
+uniform vec4 outlineColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 texel = texture(texture0, fragTexCoord); // Get texel color
+ vec2 texelScale = vec2(0.0);
+ texelScale.x = outlineSize/textureSize.x;
+ texelScale.y = outlineSize/textureSize.y;
+
+ // We sample four corner texels, but only for the alpha channel (this is for the outline)
+ vec4 corners = vec4(0.0);
+ corners.x = texture(texture0, fragTexCoord + vec2(texelScale.x, texelScale.y)).a;
+ corners.y = texture(texture0, fragTexCoord + vec2(texelScale.x, -texelScale.y)).a;
+ corners.z = texture(texture0, fragTexCoord + vec2(-texelScale.x, texelScale.y)).a;
+ corners.w = texture(texture0, fragTexCoord + vec2(-texelScale.x, -texelScale.y)).a;
+
+ float outline = min(dot(corners, vec4(1.0)), 1.0);
+ vec4 color = mix(vec4(0.0), outlineColor, outline);
+ finalColor = mix(color, texel, texel.a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs b/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs
new file mode 100644
index 0000000..d1a4b6a
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // To show overdraw, we just render all the fragments
+ // with a solid color and some transparency
+
+ // NOTE: This is not a postpro render,
+ // it will only render all screen texture in a plain color
+
+ finalColor = vec4(1.0, 0.0, 0.0, 0.2);
+}
+
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs b/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs
new file mode 100644
index 0000000..7c8a488
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs
@@ -0,0 +1,30 @@
+#version 330
+
+const int colors = 8;
+
+// Input fragment attributes (from fragment shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[colors];
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord)*fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0, 1] to [0, 255].
+ int index = int(texelColor.r*255.0);
+ ivec3 color = palette[index];
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0, 255] and need to be normalized to [0, 1]
+ // for OpenGL to work.
+ finalColor = vec4(color/255.0, texelColor.a);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs b/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs
new file mode 100644
index 0000000..cf8aec4
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs
@@ -0,0 +1,33 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+uniform float pixelWidth = 5.0;
+uniform float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture(texture0, coord).rgb;
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs b/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs
new file mode 100644
index 0000000..cf84585
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs
@@ -0,0 +1,31 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord.xy).rgb;
+
+ texelColor = pow(texelColor, vec3(gamma, gamma, gamma));
+ texelColor = texelColor*numColors;
+ texelColor = floor(texelColor);
+ texelColor = texelColor/numColors;
+ texelColor = pow(texelColor, vec3(1.0/gamma));
+
+ finalColor = vec4(texelColor, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/predator.fs b/raylib/examples/shaders/resources/shaders/glsl330/predator.fs
new file mode 100644
index 0000000..c0db7b3
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/predator.fs
@@ -0,0 +1,32 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (texelColor.r + texelColor.g + texelColor.b)/3.0;
+
+ int ix = (lum < 0.5)? 0:1;
+
+ vec3 tc = mix(colors[ix], colors[ix + 1], (lum - float(ix)*0.5)/0.5);
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs b/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs
new file mode 100644
index 0000000..6a9eb45
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs
@@ -0,0 +1,430 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform vec3 viewEye;
+uniform vec3 viewCenter;
+uniform float runTime;
+uniform vec2 resolution;
+
+// The MIT License
+// Copyright © 2013 Inigo Quilez
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// A list of useful distance function to simple primitives, and an example on how to
+// do some interesting boolean operations, repetition and displacement.
+//
+// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+
+#define AA 1 // make this 1 is your machine is too slow
+
+//------------------------------------------------------------------
+
+float sdPlane( vec3 p )
+{
+ return p.y;
+}
+
+float sdSphere( vec3 p, float s )
+{
+ return length(p)-s;
+}
+
+float sdBox( vec3 p, vec3 b )
+{
+ vec3 d = abs(p) - b;
+ return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
+}
+
+float sdEllipsoid( in vec3 p, in vec3 r )
+{
+ return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
+}
+
+float udRoundBox( vec3 p, vec3 b, float r )
+{
+ return length(max(abs(p)-b,0.0))-r;
+}
+
+float sdTorus( vec3 p, vec2 t )
+{
+ return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
+}
+
+float sdHexPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+#if 0
+ return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
+#else
+ float d1 = q.z-h.y;
+ float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+#endif
+}
+
+float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
+{
+ vec3 pa = p-a, ba = b-a;
+ float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+ return length( pa - ba*h ) - r;
+}
+
+float sdEquilateralTriangle( in vec2 p )
+{
+ const float k = sqrt(3.0);
+ p.x = abs(p.x) - 1.0;
+ p.y = p.y + 1.0/k;
+ if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
+ p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
+ return -length(p)*sign(p.y);
+}
+
+float sdTriPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+ float d1 = q.z-h.y;
+#if 1
+ // distance bound
+ float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
+#else
+ // correct distance
+ h.x *= 0.866025;
+ float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
+#endif
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdCylinder( vec3 p, vec2 h )
+{
+ vec2 d = abs(vec2(length(p.xz),p.y)) - h;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+float sdCone( in vec3 p, in vec3 c )
+{
+ vec2 q = vec2( length(p.xz), p.y );
+ float d1 = -q.y-c.z;
+ float d2 = max( dot(q,c.xy), q.y);
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
+{
+ float d1 = -p.y - h;
+ float q = p.y - h;
+ float si = 0.5*(r1-r2)/h;
+ float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
+{
+ // Tetrahedron = Octahedron - Cube
+ float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
+
+ float d = 0.0;
+ d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
+ float octa = d - h.z;
+ return max(-box,octa); // Subtraction
+ }
+
+float length2( vec2 p )
+{
+ return sqrt( p.x*p.x + p.y*p.y );
+}
+
+float length6( vec2 p )
+{
+ p = p*p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/6.0 );
+}
+
+float length8( vec2 p )
+{
+ p = p*p; p = p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/8.0 );
+}
+
+float sdTorus82( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length2(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdTorus88( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length8(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdCylinder6( vec3 p, vec2 h )
+{
+ return max( length6(p.xz)-h.x, abs(p.y)-h.y );
+}
+
+//------------------------------------------------------------------
+
+float opS( float d1, float d2 )
+{
+ return max(-d2,d1);
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec3 opRep( vec3 p, vec3 c )
+{
+ return mod(p,c)-0.5*c;
+}
+
+vec3 opTwist( vec3 p )
+{
+ float c = cos(10.0*p.y+10.0);
+ float s = sin(10.0*p.y+10.0);
+ mat2 m = mat2(c,-s,s,c);
+ return vec3(m*p.xz,p.y);
+}
+
+//------------------------------------------------------------------
+
+vec2 map( in vec3 pos )
+{
+ vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
+ vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
+ res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
+ res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
+ res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
+ res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
+ res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
+ res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
+ res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
+ res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
+ res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
+ res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
+ res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
+ res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
+ res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
+ sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
+ res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
+ sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
+ res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
+ res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
+ res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
+ res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
+
+ return res;
+}
+
+vec2 castRay( in vec3 ro, in vec3 rd )
+{
+ float tmin = 0.2;
+ float tmax = 30.0;
+
+#if 1
+ // bounding volume
+ float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
+ float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
+ else tmax = min( tmax, tp2 ); }
+#endif
+
+ float t = tmin;
+ float m = -1.0;
+ for( int i=0; i<64; i++ )
+ {
+ float precis = 0.0005*t;
+ vec2 res = map( ro+rd*t );
+ if( res.x<precis || t>tmax ) break;
+ t += res.x;
+ m = res.y;
+ }
+
+ if( t>tmax ) m=-1.0;
+ return vec2( t, m );
+}
+
+
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ float res = 1.0;
+ float t = mint;
+ for( int i=0; i<16; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ res = min( res, 8.0*h/t );
+ t += clamp( h, 0.02, 0.10 );
+ if( h<0.001 || t>tmax ) break;
+ }
+ return clamp( res, 0.0, 1.0 );
+}
+
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+ /*
+ vec3 eps = vec3( 0.0005, 0.0, 0.0 );
+ vec3 nor = vec3(
+ map(pos+eps.xyy).x - map(pos-eps.xyy).x,
+ map(pos+eps.yxy).x - map(pos-eps.yxy).x,
+ map(pos+eps.yyx).x - map(pos-eps.yyx).x );
+ return normalize(nor);
+ */
+}
+
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=0; i<5; i++ )
+ {
+ float hr = 0.01 + 0.12*float(i)/4.0;
+ vec3 aopos = nor * hr + pos;
+ float dd = map( aopos ).x;
+ occ += -(dd-hr)*sca;
+ sca *= 0.95;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
+}
+
+// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+vec3 render( in vec3 ro, in vec3 rd )
+{
+ vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
+ vec2 res = castRay(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
+ if( m<1.5 )
+ {
+
+ float f = checkersGradBox( 5.0*pos.xz );
+ col = 0.3 + f*vec3(0.1);
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+ vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ float dom = smoothstep( -0.1, 0.1, ref.y );
+ float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
+
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
+ dif *
+ (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
+
+ vec3 lin = vec3(0.0);
+ lin += 1.30*dif*vec3(1.00,0.80,0.55);
+ lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
+ lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
+ col = col*lin;
+ col += 10.00*spe*vec3(1.00,0.90,0.70);
+
+ col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
+ }
+
+ return vec3( clamp(col,0.0,1.0) );
+}
+
+mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
+{
+ vec3 cw = normalize(ta-ro);
+ vec3 cp = vec3(sin(cr), cos(cr),0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = normalize( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec3 tot = vec3(0.0);
+#if AA>1
+ for( int m=0; m<AA; m++ )
+ for( int n=0; n<AA; n++ )
+ {
+ // pixel coordinates
+ vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
+ vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
+#else
+ vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
+#endif
+
+ // RAY: Camera is provided from raylib
+ //vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
+
+ vec3 ro = viewEye;
+ vec3 ta = viewCenter;
+
+ // camera-to-world transformation
+ mat3 ca = setCamera( ro, ta, 0.0 );
+ // ray direction
+ vec3 rd = ca * normalize( vec3(p.xy,2.0) );
+
+ // render
+ vec3 col = render( ro, rd );
+
+ // gamma
+ col = pow( col, vec3(0.4545) );
+
+ tot += col;
+#if AA>1
+ }
+ tot /= float(AA*AA);
+#endif
+
+ finalColor = vec4( tot, 1.0 );
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/reload.fs b/raylib/examples/shaders/resources/shaders/glsl330/reload.fs
new file mode 100644
index 0000000..59fdcba
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/reload.fs
@@ -0,0 +1,40 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord; // Texture coordinates (sampler2D)
+in vec4 fragColor; // Tint color
+
+// Output fragment color
+out vec4 finalColor; // Output fragment color
+
+// Uniform inputs
+uniform vec2 resolution; // Viewport resolution (in pixels)
+uniform vec2 mouse; // Mouse pixel xy coordinates
+uniform float time; // Total run time (in secods)
+
+// Draw circle
+vec4 DrawCircle(vec2 fragCoord, vec2 position, float radius, vec3 color)
+{
+ float d = length(position - fragCoord) - radius;
+ float t = clamp(d, 0.0, 1.0);
+ return vec4(color, 1.0 - t);
+}
+
+void main()
+{
+ vec2 fragCoord = gl_FragCoord.xy;
+ vec2 position = vec2(mouse.x, resolution.y - mouse.y);
+ float radius = 40.0;
+
+ // Draw background layer
+ vec4 colorA = vec4(0.2,0.2,0.8, 1.0);
+ vec4 colorB = vec4(1.0,0.7,0.2, 1.0);
+ vec4 layer1 = mix(colorA, colorB, abs(sin(time*0.1)));
+
+ // Draw circle layer
+ vec3 color = vec3(0.9, 0.16, 0.21);
+ vec4 layer2 = DrawCircle(fragCoord, position, radius, color);
+
+ // Blend the two layers
+ finalColor = mix(layer1, layer2, layer2.a);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs b/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs
new file mode 100644
index 0000000..2c4c6fd
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs
@@ -0,0 +1,49 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+float offset = 0.0;
+
+uniform float time;
+
+void main()
+{
+ float frequency = renderHeight/3.0;
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ finalColor = mix(vec4(0.0, 0.3, 0.0, 0.0), texelColor, wavePos);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs b/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs
new file mode 100644
index 0000000..f76e9ca
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs
@@ -0,0 +1,41 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+uniform vec2 resolution = vec2(800, 450);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ finalColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs b/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs
new file mode 100644
index 0000000..02cddf4
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs
@@ -0,0 +1,65 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_SPOTS 3
+
+struct Spot {
+ vec2 pos; // window coords of spot
+ float inner; // inner fully transparent centre radius
+ float radius; // alpha fades out to this radius
+};
+
+uniform Spot spots[MAX_SPOTS]; // Spotlight positions array
+uniform float screenWidth; // Width of the screen
+
+void main()
+{
+ float alpha = 1.0;
+
+ // Get the position of the current fragment (screen coordinates!)
+ vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y);
+
+ // Find out which spotlight is nearest
+ float d = 65000; // some high value
+ int fi = -1; // found index
+
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ for (int j = 0; j < MAX_SPOTS; j++)
+ {
+ float dj = distance(pos, spots[j].pos) - spots[j].radius + spots[i].radius;
+
+ if (d > dj)
+ {
+ d = dj;
+ fi = i;
+ }
+ }
+ }
+
+ // d now equals distance to nearest spot...
+ // allowing for the different radii of all spotlights
+ if (fi != -1)
+ {
+ if (d > spots[fi].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[fi].inner) alpha = 0.0;
+ else alpha = (d - spots[fi].inner) / (spots[fi].radius - spots[fi].inner);
+ }
+ }
+
+ // Right hand side of screen is dimly lit,
+ // could make the threshold value user definable
+ if ((pos.x > screenWidth/2.0) && (alpha > 0.9)) alpha = 0.9;
+
+ finalColor = vec4(0, 0, 0, alpha);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs b/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs
new file mode 100644
index 0000000..bb0732c
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs
@@ -0,0 +1,47 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center = vec2(200.0, 200.0);
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ finalColor = vec4(color.rgb, 1.0);;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs b/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs
new file mode 100644
index 0000000..6e7f524
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs
@@ -0,0 +1,14 @@
+#version 330 core
+
+uniform sampler2D diffuseMap;
+uniform vec2 tiling;
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+void main()
+{
+ vec2 texCoord = fragTexCoord * tiling;
+ fragColor = texture(diffuseMap, texCoord);
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/wave.fs b/raylib/examples/shaders/resources/shaders/glsl330/wave.fs
new file mode 100644
index 0000000..1f22bee
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/wave.fs
@@ -0,0 +1,37 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform float seconds;
+
+uniform vec2 size;
+
+uniform float freqX;
+uniform float freqY;
+uniform float ampX;
+uniform float ampY;
+uniform float speedX;
+uniform float speedY;
+
+void main() {
+ float pixelWidth = 1.0 / size.x;
+ float pixelHeight = 1.0 / size.y;
+ float aspect = pixelHeight / pixelWidth;
+ float boxLeft = 0.0;
+ float boxTop = 0.0;
+
+ vec2 p = fragTexCoord;
+ p.x += cos((fragTexCoord.y - boxTop) * freqX / ( pixelWidth * 750.0) + (seconds * speedX)) * ampX * pixelWidth;
+ p.y += sin((fragTexCoord.x - boxLeft) * freqY * aspect / ( pixelHeight * 750.0) + (seconds * speedY)) * ampY * pixelHeight;
+
+ finalColor = texture(texture0, p)*colDiffuse*fragColor;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs b/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs
new file mode 100644
index 0000000..f0e07be
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs
@@ -0,0 +1,20 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ finalColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepth = 1.0 - finalColor.z;
+}
diff --git a/raylib/examples/shaders/resources/space.png b/raylib/examples/shaders/resources/space.png
new file mode 100644
index 0000000..5d016e4
--- /dev/null
+++ b/raylib/examples/shaders/resources/space.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/spark_flame.png b/raylib/examples/shaders/resources/spark_flame.png
new file mode 100644
index 0000000..72cea2e
--- /dev/null
+++ b/raylib/examples/shaders/resources/spark_flame.png
Binary files differ
diff --git a/raylib/examples/shaders/resources/texel_checker.png b/raylib/examples/shaders/resources/texel_checker.png
new file mode 100644
index 0000000..79d3832
--- /dev/null
+++ b/raylib/examples/shaders/resources/texel_checker.png
Binary files differ
diff --git a/raylib/examples/shaders/rlights.h b/raylib/examples/shaders/rlights.h
new file mode 100644
index 0000000..d17bf7c
--- /dev/null
+++ b/raylib/examples/shaders/rlights.h
@@ -0,0 +1,170 @@
+/**********************************************************************************************
+*
+* raylib.lights - Some useful functions to deal with lights data
+*
+* CONFIGURATION:
+*
+* #define RLIGHTS_IMPLEMENTATION
+* Generates the implementation of the library into the included file.
+* If not defined, the library is in header only mode and can be included in other headers
+* or source files without problems. But only ONE file should hold the implementation.
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2017-2023 Victor Fisac (@victorfisac) and Ramon Santamaria (@raysan5)
+*
+* This software is provided "as-is", without any express or implied warranty. In no event
+* will the authors be held liable for any damages arising from the use of this software.
+*
+* Permission is granted to anyone to use this software for any purpose, including commercial
+* applications, and to alter it and redistribute it freely, subject to the following restrictions:
+*
+* 1. The origin of this software must not be misrepresented; you must not claim that you
+* wrote the original software. If you use this software in a product, an acknowledgment
+* in the product documentation would be appreciated but is not required.
+*
+* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
+* as being the original software.
+*
+* 3. This notice may not be removed or altered from any source distribution.
+*
+**********************************************************************************************/
+
+#ifndef RLIGHTS_H
+#define RLIGHTS_H
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+#define MAX_LIGHTS 4 // Max dynamic lights supported by shader
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+
+// Light data
+typedef struct {
+ int type;
+ bool enabled;
+ Vector3 position;
+ Vector3 target;
+ Color color;
+ float attenuation;
+
+ // Shader locations
+ int enabledLoc;
+ int typeLoc;
+ int positionLoc;
+ int targetLoc;
+ int colorLoc;
+ int attenuationLoc;
+} Light;
+
+// Light type
+typedef enum {
+ LIGHT_DIRECTIONAL = 0,
+ LIGHT_POINT
+} LightType;
+
+#ifdef __cplusplus
+extern "C" { // Prevents name mangling of functions
+#endif
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+Light CreateLight(int type, Vector3 position, Vector3 target, Color color, Shader shader); // Create a light and get shader locations
+void UpdateLightValues(Shader shader, Light light); // Send light properties to shader
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // RLIGHTS_H
+
+
+/***********************************************************************************
+*
+* RLIGHTS IMPLEMENTATION
+*
+************************************************************************************/
+
+#if defined(RLIGHTS_IMPLEMENTATION)
+
+#include "raylib.h"
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+static int lightsCount = 0; // Current amount of created lights
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Declaration
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+//----------------------------------------------------------------------------------
+
+// Create a light and get shader locations
+Light CreateLight(int type, Vector3 position, Vector3 target, Color color, Shader shader)
+{
+ Light light = { 0 };
+
+ if (lightsCount < MAX_LIGHTS)
+ {
+ light.enabled = true;
+ light.type = type;
+ light.position = position;
+ light.target = target;
+ light.color = color;
+
+ // NOTE: Lighting shader naming must be the provided ones
+ light.enabledLoc = GetShaderLocation(shader, TextFormat("lights[%i].enabled", lightsCount));
+ light.typeLoc = GetShaderLocation(shader, TextFormat("lights[%i].type", lightsCount));
+ light.positionLoc = GetShaderLocation(shader, TextFormat("lights[%i].position", lightsCount));
+ light.targetLoc = GetShaderLocation(shader, TextFormat("lights[%i].target", lightsCount));
+ light.colorLoc = GetShaderLocation(shader, TextFormat("lights[%i].color", lightsCount));
+
+ UpdateLightValues(shader, light);
+
+ lightsCount++;
+ }
+
+ return light;
+}
+
+// Send light properties to shader
+// NOTE: Light shader locations should be available
+void UpdateLightValues(Shader shader, Light light)
+{
+ // Send to shader light enabled state and type
+ SetShaderValue(shader, light.enabledLoc, &light.enabled, SHADER_UNIFORM_INT);
+ SetShaderValue(shader, light.typeLoc, &light.type, SHADER_UNIFORM_INT);
+
+ // Send to shader light position values
+ float position[3] = { light.position.x, light.position.y, light.position.z };
+ SetShaderValue(shader, light.positionLoc, position, SHADER_UNIFORM_VEC3);
+
+ // Send to shader light target position values
+ float target[3] = { light.target.x, light.target.y, light.target.z };
+ SetShaderValue(shader, light.targetLoc, target, SHADER_UNIFORM_VEC3);
+
+ // Send to shader light color values
+ float color[4] = { (float)light.color.r/(float)255, (float)light.color.g/(float)255,
+ (float)light.color.b/(float)255, (float)light.color.a/(float)255 };
+ SetShaderValue(shader, light.colorLoc, color, SHADER_UNIFORM_VEC4);
+}
+
+#endif // RLIGHTS_IMPLEMENTATION \ No newline at end of file
diff --git a/raylib/examples/shaders/shader_texture_tiling.c b/raylib/examples/shaders/shader_texture_tiling.c
new file mode 100644
index 0000000..868d6b8
--- /dev/null
+++ b/raylib/examples/shaders/shader_texture_tiling.c
@@ -0,0 +1,94 @@
+/*******************************************************************************************
+*
+* raylib [textures] example - Texture Tiling
+*
+* Example demonstrates how to tile a texture on a 3D model using raylib.
+*
+* Example contributed by Luís Almeida (https://github.com/luis605)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2023 Luís Almeida (https://github.com/luis605)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+
+int main(void)
+{
+ const int screenWidth = 800;
+ const int screenHeight = 600;
+
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ InitWindow(screenWidth, screenHeight, "Raylib Texture Tiling");
+
+ SetTargetFPS(60);
+
+ // Load a texture
+ Texture2D texture = LoadTexture("resources/raylib_logo.png");
+
+ // Create a cube mesh
+ Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
+
+ // Load the texture onto the GPU
+ Model model = LoadModelFromMesh(cube);
+ model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
+
+ // Set the tiling of the texture
+ float tiling[2] = {3.0f, 3.0f};
+ Shader shader = LoadShader(0, "resources/shaders/glsl330/tiling.fs"); // Create a custom shader in a .glsl file
+ SetShaderValue(shader, GetShaderLocation(shader, "tiling"), tiling, SHADER_UNIFORM_VEC2);
+ model.materials[0].shader = shader;
+
+ // Camera setup
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 3.0f, 3.0f, 3.0f };
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
+ camera.fovy = 45.0f;
+ camera.projection = CAMERA_PERSPECTIVE;
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+ UpdateCamera(&camera, CAMERA_FREE);
+
+ // Draw the model
+ {
+ BeginMode3D(camera);
+ BeginShaderMode(shader);
+
+ DrawModel(model, (Vector3){ 0.0f, 0.0f, 0.0f }, 5.0f, WHITE);
+
+ EndShaderMode();
+ EndMode3D();
+ }
+
+ DrawText("Use mouse to rotate the camera", 10, 10, 20, DARKGRAY);
+
+ EndDrawing();
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ UnloadTexture(texture); // Unload texture
+ UnloadModel(model); // Unload model
+ UnloadShader(shader); // Unload shader
+
+
+ CloseWindow(); // Close window and OpenGL context
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_basic_lighting.c b/raylib/examples/shaders/shaders_basic_lighting.c
new file mode 100644
index 0000000..3fbe60b
--- /dev/null
+++ b/raylib/examples/shaders/shaders_basic_lighting.c
@@ -0,0 +1,148 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - basic lighting
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
+*
+* Example originally created with raylib 3.0, last time updated with raylib 4.2
+*
+* Example contributed by Chris Camacho (@codifies) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Chris Camacho (@codifies) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h"
+
+#define RLIGHTS_IMPLEMENTATION
+#include "rlights.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - basic lighting");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 2.0f, 4.0f, 6.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.5f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Load plane model from a generated mesh
+ Model model = LoadModelFromMesh(GenMeshPlane(10.0f, 10.0f, 3, 3));
+ Model cube = LoadModelFromMesh(GenMeshCube(2.0f, 4.0f, 2.0f));
+
+ // Load basic lighting shader
+ Shader shader = LoadShader(TextFormat("resources/shaders/glsl%i/lighting.vs", GLSL_VERSION),
+ TextFormat("resources/shaders/glsl%i/lighting.fs", GLSL_VERSION));
+ // Get some required shader locations
+ shader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(shader, "viewPos");
+ // NOTE: "matModel" location name is automatically assigned on shader loading,
+ // no need to get the location again if using that uniform name
+ //shader.locs[SHADER_LOC_MATRIX_MODEL] = GetShaderLocation(shader, "matModel");
+
+ // Ambient light level (some basic lighting)
+ int ambientLoc = GetShaderLocation(shader, "ambient");
+ SetShaderValue(shader, ambientLoc, (float[4]){ 0.1f, 0.1f, 0.1f, 1.0f }, SHADER_UNIFORM_VEC4);
+
+ // Assign out lighting shader to model
+ model.materials[0].shader = shader;
+ cube.materials[0].shader = shader;
+
+ // Create lights
+ Light lights[MAX_LIGHTS] = { 0 };
+ lights[0] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, -2 }, Vector3Zero(), YELLOW, shader);
+ lights[1] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, 2 }, Vector3Zero(), RED, shader);
+ lights[2] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, 2 }, Vector3Zero(), GREEN, shader);
+ lights[3] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, -2 }, Vector3Zero(), BLUE, shader);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ // Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f })
+ float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
+ SetShaderValue(shader, shader.locs[SHADER_LOC_VECTOR_VIEW], cameraPos, SHADER_UNIFORM_VEC3);
+
+ // Check key inputs to enable/disable lights
+ if (IsKeyPressed(KEY_Y)) { lights[0].enabled = !lights[0].enabled; }
+ if (IsKeyPressed(KEY_R)) { lights[1].enabled = !lights[1].enabled; }
+ if (IsKeyPressed(KEY_G)) { lights[2].enabled = !lights[2].enabled; }
+ if (IsKeyPressed(KEY_B)) { lights[3].enabled = !lights[3].enabled; }
+
+ // Update light values (actually, only enable/disable them)
+ for (int i = 0; i < MAX_LIGHTS; i++) UpdateLightValues(shader, lights[i]);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawModel(model, Vector3Zero(), 1.0f, WHITE);
+ DrawModel(cube, Vector3Zero(), 1.0f, WHITE);
+
+ // Draw spheres to show where the lights are
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lights[i].color);
+ else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lights[i].color, 0.3f));
+ }
+
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawFPS(10, 10);
+
+ DrawText("Use keys [Y][R][G][B] to toggle lights", 10, 40, 20, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(model); // Unload the model
+ UnloadModel(cube); // Unload the model
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
diff --git a/raylib/examples/shaders/shaders_basic_lighting.png b/raylib/examples/shaders/shaders_basic_lighting.png
new file mode 100644
index 0000000..b88b8cf
--- /dev/null
+++ b/raylib/examples/shaders/shaders_basic_lighting.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_custom_uniform.c b/raylib/examples/shaders/shaders_custom_uniform.c
new file mode 100644
index 0000000..0a1a764
--- /dev/null
+++ b/raylib/examples/shaders/shaders_custom_uniform.c
@@ -0,0 +1,129 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Apply a postprocessing shader and connect a custom uniform variable
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 1.3, last time updated with raylib 4.0
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - custom uniform variable");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 8.0f, 8.0f, 8.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 1.5f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Model model = LoadModel("resources/models/barracks.obj"); // Load OBJ model
+ Texture2D texture = LoadTexture("resources/models/barracks_diffuse.png"); // Load model texture (diffuse map)
+ model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Set model diffuse texture
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
+
+ // Load postprocessing shader
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/swirl.fs", GLSL_VERSION));
+
+ // Get variable (uniform) location on the shader to connect with the program
+ // NOTE: If uniform variable could not be found in the shader, function returns -1
+ int swirlCenterLoc = GetShaderLocation(shader, "center");
+
+ float swirlCenter[2] = { (float)screenWidth/2, (float)screenHeight/2 };
+
+ // Create a RenderTexture2D to be used for render to texture
+ RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ Vector2 mousePosition = GetMousePosition();
+
+ swirlCenter[0] = mousePosition.x;
+ swirlCenter[1] = screenHeight - mousePosition.y;
+
+ // Send new value to the shader to be used on drawing
+ SetShaderValue(shader, swirlCenterLoc, swirlCenter, SHADER_UNIFORM_VEC2);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(target); // Enable drawing to texture
+ ClearBackground(RAYWHITE); // Clear texture background
+
+ BeginMode3D(camera); // Begin 3d mode drawing
+ DrawModel(model, position, 0.5f, WHITE); // Draw 3d model with texture
+ DrawGrid(10, 1.0f); // Draw a grid
+ EndMode3D(); // End 3d mode drawing, returns to orthographic 2d mode
+
+ DrawText("TEXT DRAWN IN RENDER TEXTURE", 200, 10, 30, RED);
+ EndTextureMode(); // End drawing to texture (now we have a texture available for next passes)
+
+ BeginDrawing();
+ ClearBackground(RAYWHITE); // Clear screen background
+
+ // Enable shader using the custom uniform
+ BeginShaderMode(shader);
+ // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
+ DrawTextureRec(target.texture, (Rectangle){ 0, 0, (float)target.texture.width, (float)-target.texture.height }, (Vector2){ 0, 0 }, WHITE);
+ EndShaderMode();
+
+ // Draw some 2d text over drawn texture
+ DrawText("(c) Barracks 3D model by Alberto Cano", screenWidth - 220, screenHeight - 20, 10, GRAY);
+ DrawFPS(10, 10);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(texture); // Unload texture
+ UnloadModel(model); // Unload model
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_custom_uniform.png b/raylib/examples/shaders/shaders_custom_uniform.png
new file mode 100644
index 0000000..96e3e00
--- /dev/null
+++ b/raylib/examples/shaders/shaders_custom_uniform.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_eratosthenes.c b/raylib/examples/shaders/shaders_eratosthenes.c
new file mode 100644
index 0000000..005a97a
--- /dev/null
+++ b/raylib/examples/shaders/shaders_eratosthenes.c
@@ -0,0 +1,97 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Sieve of Eratosthenes
+*
+* NOTE: Sieve of Eratosthenes, the earliest known (ancient Greek) prime number sieve.
+*
+* "Sift the twos and sift the threes,
+* The Sieve of Eratosthenes.
+* When the multiples sublime,
+* the numbers that are left are prime."
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
+*
+* Example originally created with raylib 2.5, last time updated with raylib 4.0
+*
+* Example contributed by ProfJski and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 ProfJski and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - Sieve of Eratosthenes");
+
+ RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight);
+
+ // Load Eratosthenes shader
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/eratosthenes.fs", GLSL_VERSION));
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // Nothing to do here, everything is happening in the shader
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(target); // Enable drawing to texture
+ ClearBackground(BLACK); // Clear the render texture
+
+ // Draw a rectangle in shader mode to be used as shader canvas
+ // NOTE: Rectangle uses font white character texture coordinates,
+ // so shader can not be applied here directly because input vertexTexCoord
+ // do not represent full screen coordinates (space where want to apply shader)
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLACK);
+ EndTextureMode(); // End drawing to texture (now we have a blank texture available for the shader)
+
+ BeginDrawing();
+ ClearBackground(RAYWHITE); // Clear screen background
+
+ BeginShaderMode(shader);
+ // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
+ DrawTextureRec(target.texture, (Rectangle){ 0, 0, (float)target.texture.width, (float)-target.texture.height }, (Vector2){ 0.0f, 0.0f }, WHITE);
+ EndShaderMode();
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_eratosthenes.png b/raylib/examples/shaders/shaders_eratosthenes.png
new file mode 100644
index 0000000..acd7fc7
--- /dev/null
+++ b/raylib/examples/shaders/shaders_eratosthenes.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_fog.c b/raylib/examples/shaders/shaders_fog.c
new file mode 100644
index 0000000..cd36936
--- /dev/null
+++ b/raylib/examples/shaders/shaders_fog.c
@@ -0,0 +1,155 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - fog
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.7
+*
+* Example contributed by Chris Camacho (@chriscamacho) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Chris Camacho (@chriscamacho) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h"
+
+#define RLIGHTS_IMPLEMENTATION
+#include "rlights.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - fog");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 2.0f, 2.0f, 6.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.5f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Load models and texture
+ Model modelA = LoadModelFromMesh(GenMeshTorus(0.4f, 1.0f, 16, 32));
+ Model modelB = LoadModelFromMesh(GenMeshCube(1.0f, 1.0f, 1.0f));
+ Model modelC = LoadModelFromMesh(GenMeshSphere(0.5f, 32, 32));
+ Texture texture = LoadTexture("resources/texel_checker.png");
+
+ // Assign texture to default model material
+ modelA.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
+ modelB.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
+ modelC.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
+
+ // Load shader and set up some uniforms
+ Shader shader = LoadShader(TextFormat("resources/shaders/glsl%i/lighting.vs", GLSL_VERSION),
+ TextFormat("resources/shaders/glsl%i/fog.fs", GLSL_VERSION));
+ shader.locs[SHADER_LOC_MATRIX_MODEL] = GetShaderLocation(shader, "matModel");
+ shader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(shader, "viewPos");
+
+ // Ambient light level
+ int ambientLoc = GetShaderLocation(shader, "ambient");
+ SetShaderValue(shader, ambientLoc, (float[4]){ 0.2f, 0.2f, 0.2f, 1.0f }, SHADER_UNIFORM_VEC4);
+
+ float fogDensity = 0.15f;
+ int fogDensityLoc = GetShaderLocation(shader, "fogDensity");
+ SetShaderValue(shader, fogDensityLoc, &fogDensity, SHADER_UNIFORM_FLOAT);
+
+ // NOTE: All models share the same shader
+ modelA.materials[0].shader = shader;
+ modelB.materials[0].shader = shader;
+ modelC.materials[0].shader = shader;
+
+ // Using just 1 point lights
+ CreateLight(LIGHT_POINT, (Vector3){ 0, 2, 6 }, Vector3Zero(), WHITE, shader);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ if (IsKeyDown(KEY_UP))
+ {
+ fogDensity += 0.001f;
+ if (fogDensity > 1.0f) fogDensity = 1.0f;
+ }
+
+ if (IsKeyDown(KEY_DOWN))
+ {
+ fogDensity -= 0.001f;
+ if (fogDensity < 0.0f) fogDensity = 0.0f;
+ }
+
+ SetShaderValue(shader, fogDensityLoc, &fogDensity, SHADER_UNIFORM_FLOAT);
+
+ // Rotate the torus
+ modelA.transform = MatrixMultiply(modelA.transform, MatrixRotateX(-0.025f));
+ modelA.transform = MatrixMultiply(modelA.transform, MatrixRotateZ(0.012f));
+
+ // Update the light shader with the camera view position
+ SetShaderValue(shader, shader.locs[SHADER_LOC_VECTOR_VIEW], &camera.position.x, SHADER_UNIFORM_VEC3);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(GRAY);
+
+ BeginMode3D(camera);
+
+ // Draw the three models
+ DrawModel(modelA, Vector3Zero(), 1.0f, WHITE);
+ DrawModel(modelB, (Vector3){ -2.6f, 0, 0 }, 1.0f, WHITE);
+ DrawModel(modelC, (Vector3){ 2.6f, 0, 0 }, 1.0f, WHITE);
+
+ for (int i = -20; i < 20; i += 2) DrawModel(modelA,(Vector3){ (float)i, 0, 2 }, 1.0f, WHITE);
+
+ EndMode3D();
+
+ DrawText(TextFormat("Use KEY_UP/KEY_DOWN to change fog density [%.2f]", fogDensity), 10, 10, 20, RAYWHITE);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(modelA); // Unload the model A
+ UnloadModel(modelB); // Unload the model B
+ UnloadModel(modelC); // Unload the model C
+ UnloadTexture(texture); // Unload the texture
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_fog.png b/raylib/examples/shaders/shaders_fog.png
new file mode 100644
index 0000000..1be6521
--- /dev/null
+++ b/raylib/examples/shaders/shaders_fog.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_hot_reloading.c b/raylib/examples/shaders/shaders_hot_reloading.c
new file mode 100644
index 0000000..2b1175e
--- /dev/null
+++ b/raylib/examples/shaders/shaders_hot_reloading.c
@@ -0,0 +1,135 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Hot reloading
+*
+* NOTE: This example requires raylib OpenGL 3.3 for shaders support and only #version 330
+* is currently supported. OpenGL ES 2.0 platforms are not supported at the moment.
+*
+* Example originally created with raylib 3.0, last time updated with raylib 3.5
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2020-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "rlgl.h"
+
+#include <time.h> // Required for: localtime(), asctime()
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - hot reloading");
+
+ const char *fragShaderFileName = "resources/shaders/glsl%i/reload.fs";
+ time_t fragShaderFileModTime = GetFileModTime(TextFormat(fragShaderFileName, GLSL_VERSION));
+
+ // Load raymarching shader
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat(fragShaderFileName, GLSL_VERSION));
+
+ // Get shader locations for required uniforms
+ int resolutionLoc = GetShaderLocation(shader, "resolution");
+ int mouseLoc = GetShaderLocation(shader, "mouse");
+ int timeLoc = GetShaderLocation(shader, "time");
+
+ float resolution[2] = { (float)screenWidth, (float)screenHeight };
+ SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
+
+ float totalTime = 0.0f;
+ bool shaderAutoReloading = false;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ totalTime += GetFrameTime();
+ Vector2 mouse = GetMousePosition();
+ float mousePos[2] = { mouse.x, mouse.y };
+
+ // Set shader required uniform values
+ SetShaderValue(shader, timeLoc, &totalTime, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, mouseLoc, mousePos, SHADER_UNIFORM_VEC2);
+
+ // Hot shader reloading
+ if (shaderAutoReloading || (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)))
+ {
+ long currentFragShaderModTime = GetFileModTime(TextFormat(fragShaderFileName, GLSL_VERSION));
+
+ // Check if shader file has been modified
+ if (currentFragShaderModTime != fragShaderFileModTime)
+ {
+ // Try reloading updated shader
+ Shader updatedShader = LoadShader(0, TextFormat(fragShaderFileName, GLSL_VERSION));
+
+ if (updatedShader.id != rlGetShaderIdDefault()) // It was correctly loaded
+ {
+ UnloadShader(shader);
+ shader = updatedShader;
+
+ // Get shader locations for required uniforms
+ resolutionLoc = GetShaderLocation(shader, "resolution");
+ mouseLoc = GetShaderLocation(shader, "mouse");
+ timeLoc = GetShaderLocation(shader, "time");
+
+ // Reset required uniforms
+ SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
+ }
+
+ fragShaderFileModTime = currentFragShaderModTime;
+ }
+ }
+
+ if (IsKeyPressed(KEY_A)) shaderAutoReloading = !shaderAutoReloading;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // We only draw a white full-screen rectangle, frame is generated in shader
+ BeginShaderMode(shader);
+ DrawRectangle(0, 0, screenWidth, screenHeight, WHITE);
+ EndShaderMode();
+
+ DrawText(TextFormat("PRESS [A] to TOGGLE SHADER AUTOLOADING: %s",
+ shaderAutoReloading? "AUTO" : "MANUAL"), 10, 10, 10, shaderAutoReloading? RED : BLACK);
+ if (!shaderAutoReloading) DrawText("MOUSE CLICK to SHADER RE-LOADING", 10, 30, 10, BLACK);
+
+ DrawText(TextFormat("Shader last modification: %s", asctime(localtime(&fragShaderFileModTime))), 10, 430, 10, BLACK);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_hot_reloading.png b/raylib/examples/shaders/shaders_hot_reloading.png
new file mode 100644
index 0000000..e4c23fa
--- /dev/null
+++ b/raylib/examples/shaders/shaders_hot_reloading.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_hybrid_render.c b/raylib/examples/shaders/shaders_hybrid_render.c
new file mode 100644
index 0000000..53e14b8
--- /dev/null
+++ b/raylib/examples/shaders/shaders_hybrid_render.c
@@ -0,0 +1,208 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Hybrid Rendering
+*
+* Example originally created with raylib 4.2, last time updated with raylib 4.2
+*
+* Example contributed by Buğra Alptekin Sarı (@BugraAlptekinSari) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2022-2023 Buğra Alptekin Sarı (@BugraAlptekinSari)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "rlgl.h"
+#include "math.h" // Used for tan()
+#include "raymath.h" // Used to calculate camera Direction
+
+#if defined(PLATFORM_DESKTOP)
+#define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+#define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Declare custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+static RenderTexture2D LoadRenderTextureDepthTex(int width, int height);
+// Unload render texture from GPU memory (VRAM)
+static void UnloadRenderTextureDepthTex(RenderTexture2D target);
+
+//------------------------------------------------------------------------------------
+// Declare custom Structs
+//------------------------------------------------------------------------------------
+
+typedef struct {
+ unsigned int camPos, camDir, screenCenter;
+}RayLocs ;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - write depth buffer");
+
+ // This Shader calculates pixel depth and color using raymarch
+ Shader shdrRaymarch = LoadShader(0, TextFormat("resources/shaders/glsl%i/hybrid_raymarch.fs", GLSL_VERSION));
+
+ // This Shader is a standard rasterization fragment shader with the addition of depth writing
+ // You are required to write depth for all shaders if one shader does it
+ Shader shdrRaster = LoadShader(0, TextFormat("resources/shaders/glsl%i/hybrid_raster.fs", GLSL_VERSION));
+
+ // Declare Struct used to store camera locs.
+ RayLocs marchLocs = {0};
+
+ // Fill the struct with shader locs.
+ marchLocs.camPos = GetShaderLocation(shdrRaymarch, "camPos");
+ marchLocs.camDir = GetShaderLocation(shdrRaymarch, "camDir");
+ marchLocs.screenCenter = GetShaderLocation(shdrRaymarch, "screenCenter");
+
+ // Transfer screenCenter position to shader. Which is used to calculate ray direction.
+ Vector2 screenCenter = {.x = screenWidth/2.0, .y = screenHeight/2.0};
+ SetShaderValue(shdrRaymarch, marchLocs.screenCenter , &screenCenter , SHADER_UNIFORM_VEC2);
+
+ // Use Customized function to create writable depth texture buffer
+ RenderTexture2D target = LoadRenderTextureDepthTex(screenWidth, screenHeight);
+
+ // Define the camera to look into our 3d world
+ Camera camera = {
+ .position = (Vector3){ 0.5f, 1.0f, 1.5f }, // Camera position
+ .target = (Vector3){ 0.0f, 0.5f, 0.0f }, // Camera looking at point
+ .up = (Vector3){ 0.0f, 1.0f, 0.0f }, // Camera up vector (rotation towards target)
+ .fovy = 45.0f, // Camera field-of-view Y
+ .projection = CAMERA_PERSPECTIVE // Camera projection type
+ };
+
+ // Camera FOV is pre-calculated in the camera Distance.
+ double camDist = 1.0/(tan(camera.fovy*0.5*DEG2RAD));
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ // Update Camera Postion in the ray march shader.
+ SetShaderValue(shdrRaymarch, marchLocs.camPos, &(camera.position), RL_SHADER_UNIFORM_VEC3);
+
+ // Update Camera Looking Vector. Vector length determines FOV.
+ Vector3 camDir = Vector3Scale( Vector3Normalize( Vector3Subtract(camera.target, camera.position)) , camDist);
+ SetShaderValue(shdrRaymarch, marchLocs.camDir, &(camDir), RL_SHADER_UNIFORM_VEC3);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ // Draw into our custom render texture (framebuffer)
+ BeginTextureMode(target);
+ ClearBackground(WHITE);
+
+ // Raymarch Scene
+ rlEnableDepthTest(); //Manually enable Depth Test to handle multiple rendering methods.
+ BeginShaderMode(shdrRaymarch);
+ DrawRectangleRec((Rectangle){0,0,screenWidth,screenHeight},WHITE);
+ EndShaderMode();
+
+ // Raserize Scene
+ BeginMode3D(camera);
+ BeginShaderMode(shdrRaster);
+ DrawCubeWiresV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, RED);
+ DrawCubeV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, PURPLE);
+ DrawCubeWiresV((Vector3){ 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, DARKGREEN);
+ DrawCubeV((Vector3) { 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, YELLOW);
+ DrawGrid(10, 1.0f);
+ EndShaderMode();
+ EndMode3D();
+ EndTextureMode();
+
+ // Draw into screen our custom render texture
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+
+ DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
+ DrawFPS(10, 10);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTextureDepthTex(target);
+ UnloadShader(shdrRaymarch);
+ UnloadShader(shdrRaster);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------------
+// Define custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+RenderTexture2D LoadRenderTextureDepthTex(int width, int height)
+{
+ RenderTexture2D target = { 0 };
+
+ target.id = rlLoadFramebuffer(width, height); // Load an empty framebuffer
+
+ if (target.id > 0)
+ {
+ rlEnableFramebuffer(target.id);
+
+ // Create color texture (default to RGBA)
+ target.texture.id = rlLoadTexture(0, width, height, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
+ target.texture.width = width;
+ target.texture.height = height;
+ target.texture.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
+ target.texture.mipmaps = 1;
+
+ // Create depth texture buffer (instead of raylib default renderbuffer)
+ target.depth.id = rlLoadTextureDepth(width, height, false);
+ target.depth.width = width;
+ target.depth.height = height;
+ target.depth.format = 19; //DEPTH_COMPONENT_24BIT?
+ target.depth.mipmaps = 1;
+
+ // Attach color texture and depth texture to FBO
+ rlFramebufferAttach(target.id, target.texture.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0);
+ rlFramebufferAttach(target.id, target.depth.id, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_TEXTURE2D, 0);
+
+ // Check if fbo is complete with attachments (valid)
+ if (rlFramebufferComplete(target.id)) TRACELOG(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", target.id);
+
+ rlDisableFramebuffer();
+ }
+ else TRACELOG(LOG_WARNING, "FBO: Framebuffer object can not be created");
+
+ return target;
+}
+
+// Unload render texture from GPU memory (VRAM)
+void UnloadRenderTextureDepthTex(RenderTexture2D target)
+{
+ if (target.id > 0)
+ {
+ // Color texture attached to FBO is deleted
+ rlUnloadTexture(target.texture.id);
+ rlUnloadTexture(target.depth.id);
+
+ // NOTE: Depth texture is automatically
+ // queried and deleted before deleting framebuffer
+ rlUnloadFramebuffer(target.id);
+ }
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_hybrid_render.png b/raylib/examples/shaders/shaders_hybrid_render.png
new file mode 100644
index 0000000..0a63d19
--- /dev/null
+++ b/raylib/examples/shaders/shaders_hybrid_render.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_julia_set.c b/raylib/examples/shaders/shaders_julia_set.c
new file mode 100644
index 0000000..aebb287
--- /dev/null
+++ b/raylib/examples/shaders/shaders_julia_set.c
@@ -0,0 +1,196 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Julia sets
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
+*
+* Example originally created with raylib 2.5, last time updated with raylib 4.0
+*
+* Example contributed by eggmund (@eggmund) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 eggmund (@eggmund) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+// A few good julia sets
+const float pointsOfInterest[6][2] =
+{
+ { -0.348827f, 0.607167f },
+ { -0.786268f, 0.169728f },
+ { -0.8f, 0.156f },
+ { 0.285f, 0.0f },
+ { -0.835f, -0.2321f },
+ { -0.70176f, -0.3842f },
+};
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ //SetConfigFlags(FLAG_WINDOW_HIGHDPI);
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets");
+
+ // Load julia set shader
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/julia_set.fs", GLSL_VERSION));
+
+ // Create a RenderTexture2D to be used for render to texture
+ RenderTexture2D target = LoadRenderTexture(GetScreenWidth(), GetScreenHeight());
+
+ // c constant to use in z^2 + c
+ float c[2] = { pointsOfInterest[0][0], pointsOfInterest[0][1] };
+
+ // Offset and zoom to draw the julia set at. (centered on screen and default size)
+ float offset[2] = { -(float)GetScreenWidth()/2, -(float)GetScreenHeight()/2 };
+ float zoom = 1.0f;
+
+ Vector2 offsetSpeed = { 0.0f, 0.0f };
+
+ // Get variable (uniform) locations on the shader to connect with the program
+ // NOTE: If uniform variable could not be found in the shader, function returns -1
+ int cLoc = GetShaderLocation(shader, "c");
+ int zoomLoc = GetShaderLocation(shader, "zoom");
+ int offsetLoc = GetShaderLocation(shader, "offset");
+
+ // Tell the shader what the screen dimensions, zoom, offset and c are
+ float screenDims[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
+ SetShaderValue(shader, GetShaderLocation(shader, "screenDims"), screenDims, SHADER_UNIFORM_VEC2);
+
+ SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
+ SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
+
+ int incrementSpeed = 0; // Multiplier of speed to change c value
+ bool showControls = true; // Show controls
+ bool pause = false; // Pause animation
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // Press [1 - 6] to reset c to a point of interest
+ if (IsKeyPressed(KEY_ONE) ||
+ IsKeyPressed(KEY_TWO) ||
+ IsKeyPressed(KEY_THREE) ||
+ IsKeyPressed(KEY_FOUR) ||
+ IsKeyPressed(KEY_FIVE) ||
+ IsKeyPressed(KEY_SIX))
+ {
+ if (IsKeyPressed(KEY_ONE)) c[0] = pointsOfInterest[0][0], c[1] = pointsOfInterest[0][1];
+ else if (IsKeyPressed(KEY_TWO)) c[0] = pointsOfInterest[1][0], c[1] = pointsOfInterest[1][1];
+ else if (IsKeyPressed(KEY_THREE)) c[0] = pointsOfInterest[2][0], c[1] = pointsOfInterest[2][1];
+ else if (IsKeyPressed(KEY_FOUR)) c[0] = pointsOfInterest[3][0], c[1] = pointsOfInterest[3][1];
+ else if (IsKeyPressed(KEY_FIVE)) c[0] = pointsOfInterest[4][0], c[1] = pointsOfInterest[4][1];
+ else if (IsKeyPressed(KEY_SIX)) c[0] = pointsOfInterest[5][0], c[1] = pointsOfInterest[5][1];
+
+ SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
+ }
+
+ if (IsKeyPressed(KEY_SPACE)) pause = !pause; // Pause animation (c change)
+ if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
+
+ if (!pause)
+ {
+ if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
+ else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
+
+ // TODO: The idea is to zoom and move around with mouse
+ // Probably offset movement should be proportional to zoom level
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
+ {
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) zoom += zoom*0.003f;
+ if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) zoom -= zoom*0.003f;
+
+ Vector2 mousePos = GetMousePosition();
+
+ offsetSpeed.x = mousePos.x -(float)screenWidth/2;
+ offsetSpeed.y = mousePos.y -(float)screenHeight/2;
+
+ // Slowly move camera to targetOffset
+ offset[0] += GetFrameTime()*offsetSpeed.x*0.8f;
+ offset[1] += GetFrameTime()*offsetSpeed.y*0.8f;
+ }
+ else offsetSpeed = (Vector2){ 0.0f, 0.0f };
+
+ SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
+
+ // Increment c value with time
+ float amount = GetFrameTime()*incrementSpeed*0.0005f;
+ c[0] += amount;
+ c[1] += amount;
+
+ SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ // Using a render texture to draw Julia set
+ BeginTextureMode(target); // Enable drawing to texture
+ ClearBackground(BLACK); // Clear the render texture
+
+ // Draw a rectangle in shader mode to be used as shader canvas
+ // NOTE: Rectangle uses font white character texture coordinates,
+ // so shader can not be applied here directly because input vertexTexCoord
+ // do not represent full screen coordinates (space where want to apply shader)
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLACK);
+ EndTextureMode();
+
+ BeginDrawing();
+ ClearBackground(BLACK); // Clear screen background
+
+ // Draw the saved texture and rendered julia set with shader
+ // NOTE: We do not invert texture on Y, already considered inside shader
+ BeginShaderMode(shader);
+ // WARNING: If FLAG_WINDOW_HIGHDPI is enabled, HighDPI monitor scaling should be considered
+ // when rendering the RenderTexture2D to fit in the HighDPI scaled Window
+ DrawTextureEx(target.texture, (Vector2){ 0.0f, 0.0f }, 0.0f, 1.0f, WHITE);
+ EndShaderMode();
+
+ if (showControls)
+ {
+ DrawText("Press Mouse buttons right/left to zoom in/out and move", 10, 15, 10, RAYWHITE);
+ DrawText("Press KEY_F1 to toggle these controls", 10, 30, 10, RAYWHITE);
+ DrawText("Press KEYS [1 - 6] to change point of interest", 10, 45, 10, RAYWHITE);
+ DrawText("Press KEY_LEFT | KEY_RIGHT to change speed", 10, 60, 10, RAYWHITE);
+ DrawText("Press KEY_SPACE to pause movement animation", 10, 75, 10, RAYWHITE);
+ }
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_julia_set.png b/raylib/examples/shaders/shaders_julia_set.png
new file mode 100644
index 0000000..b769c3f
--- /dev/null
+++ b/raylib/examples/shaders/shaders_julia_set.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_lightmap.c b/raylib/examples/shaders/shaders_lightmap.c
new file mode 100644
index 0000000..c5ed609
--- /dev/null
+++ b/raylib/examples/shaders/shaders_lightmap.c
@@ -0,0 +1,173 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - lightmap
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3).
+*
+* Example contributed by Jussi Viitala (@nullstare) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Jussi Viitala (@nullstare) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "raylib.h"
+#include "raymath.h"
+#include "rlgl.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+#define MAP_SIZE 10
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - lightmap");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 4.0f, 6.0f, 8.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Mesh mesh = GenMeshPlane((float)MAP_SIZE, (float)MAP_SIZE, 1, 1);
+
+ // GenMeshPlane doesn't generate texcoords2 so we will upload them separately
+ mesh.texcoords2 = (float *)RL_MALLOC(mesh.vertexCount*2*sizeof(float));
+
+ // X // Y
+ mesh.texcoords2[0] = 0.0f; mesh.texcoords2[1] = 0.0f;
+ mesh.texcoords2[2] = 1.0f; mesh.texcoords2[3] = 0.0f;
+ mesh.texcoords2[4] = 0.0f; mesh.texcoords2[5] = 1.0f;
+ mesh.texcoords2[6] = 1.0f; mesh.texcoords2[7] = 1.0f;
+
+ // Load a new texcoords2 attributes buffer
+ mesh.vboId[SHADER_LOC_VERTEX_TEXCOORD02] = rlLoadVertexBuffer(mesh.texcoords2, mesh.vertexCount*2*sizeof(float), false);
+ rlEnableVertexArray(mesh.vaoId);
+
+ // Index 5 is for texcoords2
+ rlSetVertexAttribute(5, 2, RL_FLOAT, 0, 0, 0);
+ rlEnableVertexAttribute(5);
+ rlDisableVertexArray();
+
+ // Load lightmap shader
+ Shader shader = LoadShader(TextFormat("resources/shaders/glsl%i/lightmap.vs", GLSL_VERSION),
+ TextFormat("resources/shaders/glsl%i/lightmap.fs", GLSL_VERSION));
+
+ Texture texture = LoadTexture("resources/cubicmap_atlas.png");
+ Texture light = LoadTexture("resources/spark_flame.png");
+
+ GenTextureMipmaps(&texture);
+ SetTextureFilter(texture, TEXTURE_FILTER_TRILINEAR);
+
+ RenderTexture lightmap = LoadRenderTexture(MAP_SIZE, MAP_SIZE);
+
+ SetTextureFilter(lightmap.texture, TEXTURE_FILTER_TRILINEAR);
+
+ Material material = LoadMaterialDefault();
+ material.shader = shader;
+ material.maps[MATERIAL_MAP_ALBEDO].texture = texture;
+ material.maps[MATERIAL_MAP_METALNESS].texture = lightmap.texture;
+
+ // Drawing to lightmap
+ BeginTextureMode(lightmap);
+ ClearBackground(BLACK);
+
+ BeginBlendMode(BLEND_ADDITIVE);
+ DrawTexturePro(
+ light,
+ (Rectangle){ 0, 0, light.width, light.height },
+ (Rectangle){ 0, 0, 20, 20 },
+ (Vector2){ 10.0, 10.0 },
+ 0.0,
+ RED
+ );
+ DrawTexturePro(
+ light,
+ (Rectangle){ 0, 0, light.width, light.height },
+ (Rectangle){ 8, 4, 20, 20 },
+ (Vector2){ 10.0, 10.0 },
+ 0.0,
+ BLUE
+ );
+ DrawTexturePro(
+ light,
+ (Rectangle){ 0, 0, light.width, light.height },
+ (Rectangle){ 8, 8, 10, 10 },
+ (Vector2){ 5.0, 5.0 },
+ 0.0,
+ GREEN
+ );
+ BeginBlendMode(BLEND_ALPHA);
+ EndTextureMode();
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+ DrawMesh(mesh, material, MatrixIdentity());
+ EndMode3D();
+
+ DrawFPS(10, 10);
+
+ DrawTexturePro(
+ lightmap.texture,
+ (Rectangle){ 0, 0, -MAP_SIZE, -MAP_SIZE },
+ (Rectangle){ GetRenderWidth() - MAP_SIZE*8 - 10, 10, MAP_SIZE*8, MAP_SIZE*8 },
+ (Vector2){ 0.0, 0.0 },
+ 0.0,
+ WHITE);
+
+ DrawText("lightmap", GetRenderWidth() - 66, 16 + MAP_SIZE*8, 10, GRAY);
+ DrawText("10x10 pixels", GetRenderWidth() - 76, 30 + MAP_SIZE*8, 10, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadMesh(mesh); // Unload the mesh
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
diff --git a/raylib/examples/shaders/shaders_lightmap.png b/raylib/examples/shaders/shaders_lightmap.png
new file mode 100644
index 0000000..0fd67a6
--- /dev/null
+++ b/raylib/examples/shaders/shaders_lightmap.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_mesh_instancing.c b/raylib/examples/shaders/shaders_mesh_instancing.c
new file mode 100644
index 0000000..7d603a6
--- /dev/null
+++ b/raylib/examples/shaders/shaders_mesh_instancing.c
@@ -0,0 +1,147 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Mesh instancing
+*
+* Example originally created with raylib 3.7, last time updated with raylib 4.2
+*
+* Example contributed by @seanpringle and reviewed by Max (@moliad) and Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2020-2023 @seanpringle, Max (@moliad) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+
+#include "raylib.h"
+#include "raymath.h"
+
+#define RLIGHTS_IMPLEMENTATION
+#include "rlights.h"
+
+#include <stdlib.h> // Required for: calloc(), free()
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+#define MAX_INSTANCES 10000
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - mesh instancing");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ -125.0f, 125.0f, -125.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Define mesh to be instanced
+ Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
+
+ // Define transforms to be uploaded to GPU for instances
+ Matrix *transforms = (Matrix *)RL_CALLOC(MAX_INSTANCES, sizeof(Matrix)); // Pre-multiplied transformations passed to rlgl
+
+ // Translate and rotate cubes randomly
+ for (int i = 0; i < MAX_INSTANCES; i++)
+ {
+ Matrix translation = MatrixTranslate((float)GetRandomValue(-50, 50), (float)GetRandomValue(-50, 50), (float)GetRandomValue(-50, 50));
+ Vector3 axis = Vector3Normalize((Vector3){ (float)GetRandomValue(0, 360), (float)GetRandomValue(0, 360), (float)GetRandomValue(0, 360) });
+ float angle = (float)GetRandomValue(0, 10)*DEG2RAD;
+ Matrix rotation = MatrixRotate(axis, angle);
+
+ transforms[i] = MatrixMultiply(rotation, translation);
+ }
+
+ // Load lighting shader
+ Shader shader = LoadShader(TextFormat("resources/shaders/glsl%i/lighting_instancing.vs", GLSL_VERSION),
+ TextFormat("resources/shaders/glsl%i/lighting.fs", GLSL_VERSION));
+ // Get shader locations
+ shader.locs[SHADER_LOC_MATRIX_MVP] = GetShaderLocation(shader, "mvp");
+ shader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(shader, "viewPos");
+ shader.locs[SHADER_LOC_MATRIX_MODEL] = GetShaderLocationAttrib(shader, "instanceTransform");
+
+ // Set shader value: ambient light level
+ int ambientLoc = GetShaderLocation(shader, "ambient");
+ SetShaderValue(shader, ambientLoc, (float[4]){ 0.2f, 0.2f, 0.2f, 1.0f }, SHADER_UNIFORM_VEC4);
+
+ // Create one light
+ CreateLight(LIGHT_DIRECTIONAL, (Vector3){ 50.0f, 50.0f, 0.0f }, Vector3Zero(), WHITE, shader);
+
+ // NOTE: We are assigning the intancing shader to material.shader
+ // to be used on mesh drawing with DrawMeshInstanced()
+ Material matInstances = LoadMaterialDefault();
+ matInstances.shader = shader;
+ matInstances.maps[MATERIAL_MAP_DIFFUSE].color = RED;
+
+ // Load default material (using raylib intenral default shader) for non-instanced mesh drawing
+ // WARNING: Default shader enables vertex color attribute BUT GenMeshCube() does not generate vertex colors, so,
+ // when drawing the color attribute is disabled and a default color value is provided as input for thevertex attribute
+ Material matDefault = LoadMaterialDefault();
+ matDefault.maps[MATERIAL_MAP_DIFFUSE].color = BLUE;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ // Update the light shader with the camera view position
+ float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
+ SetShaderValue(shader, shader.locs[SHADER_LOC_VECTOR_VIEW], cameraPos, SHADER_UNIFORM_VEC3);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ // Draw cube mesh with default material (BLUE)
+ DrawMesh(cube, matDefault, MatrixTranslate(-10.0f, 0.0f, 0.0f));
+
+ // Draw meshes instanced using material containing instancing shader (RED + lighting),
+ // transforms[] for the instances should be provided, they are dynamically
+ // updated in GPU every frame, so we can animate the different mesh instances
+ DrawMeshInstanced(cube, matInstances, transforms, MAX_INSTANCES);
+
+ // Draw cube mesh with default material (BLUE)
+ DrawMesh(cube, matDefault, MatrixTranslate(10.0f, 0.0f, 0.0f));
+
+ EndMode3D();
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ RL_FREE(transforms); // Free transforms
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_mesh_instancing.png b/raylib/examples/shaders/shaders_mesh_instancing.png
new file mode 100644
index 0000000..24d38b8
--- /dev/null
+++ b/raylib/examples/shaders/shaders_mesh_instancing.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_model_shader.c b/raylib/examples/shaders/shaders_model_shader.c
new file mode 100644
index 0000000..739a33b
--- /dev/null
+++ b/raylib/examples/shaders/shaders_model_shader.c
@@ -0,0 +1,107 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Model shader
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 1.3, last time updated with raylib 3.7
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - model shader");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 4.0f, 4.0f, 4.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 1.0f, -1.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Model model = LoadModel("resources/models/watermill.obj"); // Load OBJ model
+ Texture2D texture = LoadTexture("resources/models/watermill_diffuse.png"); // Load model texture
+
+ // Load shader for model
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/grayscale.fs", GLSL_VERSION));
+
+ model.materials[0].shader = shader; // Set shader effect to 3d model
+ model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Bind texture to model
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
+
+ DisableCursor(); // Limit cursor to relative movement inside the window
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_FIRST_PERSON);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawModel(model, position, 0.2f, WHITE); // Draw 3d model with texture
+
+ DrawGrid(10, 1.0f); // Draw a grid
+
+ EndMode3D();
+
+ DrawText("(c) Watermill 3D model by Alberto Cano", screenWidth - 210, screenHeight - 20, 10, GRAY);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(texture); // Unload texture
+ UnloadModel(model); // Unload model
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_model_shader.png b/raylib/examples/shaders/shaders_model_shader.png
new file mode 100644
index 0000000..df1ad7e
--- /dev/null
+++ b/raylib/examples/shaders/shaders_model_shader.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_multi_sample2d.c b/raylib/examples/shaders/shaders_multi_sample2d.c
new file mode 100644
index 0000000..f7c369b
--- /dev/null
+++ b/raylib/examples/shaders/shaders_multi_sample2d.c
@@ -0,0 +1,110 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Multiple sample2D with default batch system
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 3.5, last time updated with raylib 3.5
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2020-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib - multiple sample2D");
+
+ Image imRed = GenImageColor(800, 450, (Color){ 255, 0, 0, 255 });
+ Texture texRed = LoadTextureFromImage(imRed);
+ UnloadImage(imRed);
+
+ Image imBlue = GenImageColor(800, 450, (Color){ 0, 0, 255, 255 });
+ Texture texBlue = LoadTextureFromImage(imBlue);
+ UnloadImage(imBlue);
+
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/color_mix.fs", GLSL_VERSION));
+
+ // Get an additional sampler2D location to be enabled on drawing
+ int texBlueLoc = GetShaderLocation(shader, "texture1");
+
+ // Get shader uniform for divider
+ int dividerLoc = GetShaderLocation(shader, "divider");
+ float dividerValue = 0.5f;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (IsKeyDown(KEY_RIGHT)) dividerValue += 0.01f;
+ else if (IsKeyDown(KEY_LEFT)) dividerValue -= 0.01f;
+
+ if (dividerValue < 0.0f) dividerValue = 0.0f;
+ else if (dividerValue > 1.0f) dividerValue = 1.0f;
+
+ SetShaderValue(shader, dividerLoc, &dividerValue, SHADER_UNIFORM_FLOAT);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginShaderMode(shader);
+
+ // WARNING: Additional samplers are enabled for all draw calls in the batch,
+ // EndShaderMode() forces batch drawing and consequently resets active textures
+ // to let other sampler2D to be activated on consequent drawings (if required)
+ SetShaderValueTexture(shader, texBlueLoc, texBlue);
+
+ // We are drawing texRed using default sampler2D texture0 but
+ // an additional texture units is enabled for texBlue (sampler2D texture1)
+ DrawTexture(texRed, 0, 0, WHITE);
+
+ EndShaderMode();
+
+ DrawText("Use KEY_LEFT/KEY_RIGHT to move texture mixing in shader!", 80, GetScreenHeight() - 40, 20, RAYWHITE);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(texRed); // Unload texture
+ UnloadTexture(texBlue); // Unload texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_multi_sample2d.png b/raylib/examples/shaders/shaders_multi_sample2d.png
new file mode 100644
index 0000000..435b8f4
--- /dev/null
+++ b/raylib/examples/shaders/shaders_multi_sample2d.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_palette_switch.c b/raylib/examples/shaders/shaders_palette_switch.c
new file mode 100644
index 0000000..8767f78
--- /dev/null
+++ b/raylib/examples/shaders/shaders_palette_switch.c
@@ -0,0 +1,152 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Color palette switch
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.7
+*
+* Example contributed by Marco Lizza (@MarcoLizza) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Marco Lizza (@MarcoLizza) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+#define MAX_PALETTES 3
+#define COLORS_PER_PALETTE 8
+#define VALUES_PER_COLOR 3
+
+static const int palettes[MAX_PALETTES][COLORS_PER_PALETTE*VALUES_PER_COLOR] = {
+ { // 3-BIT RGB
+ 0, 0, 0,
+ 255, 0, 0,
+ 0, 255, 0,
+ 0, 0, 255,
+ 0, 255, 255,
+ 255, 0, 255,
+ 255, 255, 0,
+ 255, 255, 255,
+ },
+ { // AMMO-8 (GameBoy-like)
+ 4, 12, 6,
+ 17, 35, 24,
+ 30, 58, 41,
+ 48, 93, 66,
+ 77, 128, 97,
+ 137, 162, 87,
+ 190, 220, 127,
+ 238, 255, 204,
+ },
+ { // RKBV (2-strip film)
+ 21, 25, 26,
+ 138, 76, 88,
+ 217, 98, 117,
+ 230, 184, 193,
+ 69, 107, 115,
+ 75, 151, 166,
+ 165, 189, 194,
+ 255, 245, 247,
+ }
+};
+
+static const char *paletteText[] = {
+ "3-BIT RGB",
+ "AMMO-8 (GameBoy-like)",
+ "RKBV (2-strip film)"
+};
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - color palette switch");
+
+ // Load shader to be used on some parts drawing
+ // NOTE 1: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version
+ // NOTE 2: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/palette_switch.fs", GLSL_VERSION));
+
+ // Get variable (uniform) location on the shader to connect with the program
+ // NOTE: If uniform variable could not be found in the shader, function returns -1
+ int paletteLoc = GetShaderLocation(shader, "palette");
+
+ int currentPalette = 0;
+ int lineHeight = screenHeight/COLORS_PER_PALETTE;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ if (IsKeyPressed(KEY_RIGHT)) currentPalette++;
+ else if (IsKeyPressed(KEY_LEFT)) currentPalette--;
+
+ if (currentPalette >= MAX_PALETTES) currentPalette = 0;
+ else if (currentPalette < 0) currentPalette = MAX_PALETTES - 1;
+
+ // Send new value to the shader to be used on drawing.
+ // NOTE: We are sending RGB triplets w/o the alpha channel
+ SetShaderValueV(shader, paletteLoc, palettes[currentPalette], SHADER_UNIFORM_IVEC3, COLORS_PER_PALETTE);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginShaderMode(shader);
+
+ for (int i = 0; i < COLORS_PER_PALETTE; i++)
+ {
+ // Draw horizontal screen-wide rectangles with increasing "palette index"
+ // The used palette index is encoded in the RGB components of the pixel
+ DrawRectangle(0, lineHeight*i, GetScreenWidth(), lineHeight, (Color){ i, i, i, 255 });
+ }
+
+ EndShaderMode();
+
+ DrawText("< >", 10, 10, 30, DARKBLUE);
+ DrawText("CURRENT PALETTE:", 60, 15, 20, RAYWHITE);
+ DrawText(paletteText[currentPalette], 300, 15, 20, RED);
+
+ DrawFPS(700, 15);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_palette_switch.png b/raylib/examples/shaders/shaders_palette_switch.png
new file mode 100644
index 0000000..7eb3eaf
--- /dev/null
+++ b/raylib/examples/shaders/shaders_palette_switch.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_postprocessing.c b/raylib/examples/shaders/shaders_postprocessing.c
new file mode 100644
index 0000000..1a7c621
--- /dev/null
+++ b/raylib/examples/shaders/shaders_postprocessing.c
@@ -0,0 +1,177 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Apply a postprocessing shader to a scene
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 1.3, last time updated with raylib 4.0
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+#define MAX_POSTPRO_SHADERS 12
+
+typedef enum {
+ FX_GRAYSCALE = 0,
+ FX_POSTERIZATION,
+ FX_DREAM_VISION,
+ FX_PIXELIZER,
+ FX_CROSS_HATCHING,
+ FX_CROSS_STITCHING,
+ FX_PREDATOR_VIEW,
+ FX_SCANLINES,
+ FX_FISHEYE,
+ FX_SOBEL,
+ FX_BLOOM,
+ FX_BLUR,
+ //FX_FXAA
+} PostproShader;
+
+static const char *postproShaderText[] = {
+ "GRAYSCALE",
+ "POSTERIZATION",
+ "DREAM_VISION",
+ "PIXELIZER",
+ "CROSS_HATCHING",
+ "CROSS_STITCHING",
+ "PREDATOR_VIEW",
+ "SCANLINES",
+ "FISHEYE",
+ "SOBEL",
+ "BLOOM",
+ "BLUR",
+ //"FXAA"
+};
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - postprocessing shader");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 2.0f, 3.0f, 2.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ Model model = LoadModel("resources/models/church.obj"); // Load OBJ model
+ Texture2D texture = LoadTexture("resources/models/church_diffuse.png"); // Load model texture (diffuse map)
+ model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture; // Set model diffuse texture
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
+
+ // Load all postpro shaders
+ // NOTE 1: All postpro shader use the base vertex shader (DEFAULT_VERTEX_SHADER)
+ // NOTE 2: We load the correct shader depending on GLSL version
+ Shader shaders[MAX_POSTPRO_SHADERS] = { 0 };
+
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ shaders[FX_GRAYSCALE] = LoadShader(0, TextFormat("resources/shaders/glsl%i/grayscale.fs", GLSL_VERSION));
+ shaders[FX_POSTERIZATION] = LoadShader(0, TextFormat("resources/shaders/glsl%i/posterization.fs", GLSL_VERSION));
+ shaders[FX_DREAM_VISION] = LoadShader(0, TextFormat("resources/shaders/glsl%i/dream_vision.fs", GLSL_VERSION));
+ shaders[FX_PIXELIZER] = LoadShader(0, TextFormat("resources/shaders/glsl%i/pixelizer.fs", GLSL_VERSION));
+ shaders[FX_CROSS_HATCHING] = LoadShader(0, TextFormat("resources/shaders/glsl%i/cross_hatching.fs", GLSL_VERSION));
+ shaders[FX_CROSS_STITCHING] = LoadShader(0, TextFormat("resources/shaders/glsl%i/cross_stitching.fs", GLSL_VERSION));
+ shaders[FX_PREDATOR_VIEW] = LoadShader(0, TextFormat("resources/shaders/glsl%i/predator.fs", GLSL_VERSION));
+ shaders[FX_SCANLINES] = LoadShader(0, TextFormat("resources/shaders/glsl%i/scanlines.fs", GLSL_VERSION));
+ shaders[FX_FISHEYE] = LoadShader(0, TextFormat("resources/shaders/glsl%i/fisheye.fs", GLSL_VERSION));
+ shaders[FX_SOBEL] = LoadShader(0, TextFormat("resources/shaders/glsl%i/sobel.fs", GLSL_VERSION));
+ shaders[FX_BLOOM] = LoadShader(0, TextFormat("resources/shaders/glsl%i/bloom.fs", GLSL_VERSION));
+ shaders[FX_BLUR] = LoadShader(0, TextFormat("resources/shaders/glsl%i/blur.fs", GLSL_VERSION));
+
+ int currentShader = FX_GRAYSCALE;
+
+ // Create a RenderTexture2D to be used for render to texture
+ RenderTexture2D target = LoadRenderTexture(screenWidth, screenHeight);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ if (IsKeyPressed(KEY_RIGHT)) currentShader++;
+ else if (IsKeyPressed(KEY_LEFT)) currentShader--;
+
+ if (currentShader >= MAX_POSTPRO_SHADERS) currentShader = 0;
+ else if (currentShader < 0) currentShader = MAX_POSTPRO_SHADERS - 1;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginTextureMode(target); // Enable drawing to texture
+ ClearBackground(RAYWHITE); // Clear texture background
+
+ BeginMode3D(camera); // Begin 3d mode drawing
+ DrawModel(model, position, 0.1f, WHITE); // Draw 3d model with texture
+ DrawGrid(10, 1.0f); // Draw a grid
+ EndMode3D(); // End 3d mode drawing, returns to orthographic 2d mode
+ EndTextureMode(); // End drawing to texture (now we have a texture available for next passes)
+
+ BeginDrawing();
+ ClearBackground(RAYWHITE); // Clear screen background
+
+ // Render generated texture using selected postprocessing shader
+ BeginShaderMode(shaders[currentShader]);
+ // NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
+ DrawTextureRec(target.texture, (Rectangle){ 0, 0, (float)target.texture.width, (float)-target.texture.height }, (Vector2){ 0, 0 }, WHITE);
+ EndShaderMode();
+
+ // Draw 2d shapes and text over drawn texture
+ DrawRectangle(0, 9, 580, 30, Fade(LIGHTGRAY, 0.7f));
+
+ DrawText("(c) Church 3D model by Alberto Cano", screenWidth - 200, screenHeight - 20, 10, GRAY);
+ DrawText("CURRENT POSTPRO SHADER:", 10, 15, 20, BLACK);
+ DrawText(postproShaderText[currentShader], 330, 15, 20, RED);
+ DrawText("< >", 540, 10, 30, DARKBLUE);
+ DrawFPS(700, 15);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ // Unload all postpro shaders
+ for (int i = 0; i < MAX_POSTPRO_SHADERS; i++) UnloadShader(shaders[i]);
+
+ UnloadTexture(texture); // Unload texture
+ UnloadModel(model); // Unload model
+ UnloadRenderTexture(target); // Unload render texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_postprocessing.png b/raylib/examples/shaders/shaders_postprocessing.png
new file mode 100644
index 0000000..ec08726
--- /dev/null
+++ b/raylib/examples/shaders/shaders_postprocessing.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_raymarching.c b/raylib/examples/shaders/shaders_raymarching.c
new file mode 100644
index 0000000..e9b7755
--- /dev/null
+++ b/raylib/examples/shaders/shaders_raymarching.c
@@ -0,0 +1,116 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Raymarching shapes generation
+*
+* NOTE: This example requires raylib OpenGL 3.3 for shaders support and only #version 330
+* is currently supported. OpenGL ES 2.0 platforms are not supported at the moment.
+*
+* Example originally created with raylib 2.0, last time updated with raylib 4.2
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2018-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB -> Not supported at this moment
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_WINDOW_RESIZABLE);
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - raymarching shapes");
+
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 2.5f, 2.5f, 3.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.7f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 65.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Load raymarching shader
+ // NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/raymarching.fs", GLSL_VERSION));
+
+ // Get shader locations for required uniforms
+ int viewEyeLoc = GetShaderLocation(shader, "viewEye");
+ int viewCenterLoc = GetShaderLocation(shader, "viewCenter");
+ int runTimeLoc = GetShaderLocation(shader, "runTime");
+ int resolutionLoc = GetShaderLocation(shader, "resolution");
+
+ float resolution[2] = { (float)screenWidth, (float)screenHeight };
+ SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
+
+ float runTime = 0.0f;
+
+ DisableCursor(); // Limit cursor to relative movement inside the window
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_FIRST_PERSON);
+
+ float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
+ float cameraTarget[3] = { camera.target.x, camera.target.y, camera.target.z };
+
+ float deltaTime = GetFrameTime();
+ runTime += deltaTime;
+
+ // Set shader required uniform values
+ SetShaderValue(shader, viewEyeLoc, cameraPos, SHADER_UNIFORM_VEC3);
+ SetShaderValue(shader, viewCenterLoc, cameraTarget, SHADER_UNIFORM_VEC3);
+ SetShaderValue(shader, runTimeLoc, &runTime, SHADER_UNIFORM_FLOAT);
+
+ // Check if screen is resized
+ if (IsWindowResized())
+ {
+ float resolution[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
+ SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // We only draw a white full-screen rectangle,
+ // frame is generated in shader using raymarching
+ BeginShaderMode(shader);
+ DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), WHITE);
+ EndShaderMode();
+
+ DrawText("(c) Raymarching shader by Iñigo Quilez. MIT License.", GetScreenWidth() - 280, GetScreenHeight() - 20, 10, BLACK);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_raymarching.png b/raylib/examples/shaders/shaders_raymarching.png
new file mode 100644
index 0000000..e113e80
--- /dev/null
+++ b/raylib/examples/shaders/shaders_raymarching.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_shapes_textures.c b/raylib/examples/shaders/shaders_shapes_textures.c
new file mode 100644
index 0000000..cca4959
--- /dev/null
+++ b/raylib/examples/shaders/shaders_shapes_textures.c
@@ -0,0 +1,121 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Apply a shader to some shape or texture
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 1.7, last time updated with raylib 3.7
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2015-2023 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - shapes and texture shaders");
+
+ Texture2D fudesumi = LoadTexture("resources/fudesumi.png");
+
+ // Load shader to be used on some parts drawing
+ // NOTE 1: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version
+ // NOTE 2: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/grayscale.fs", GLSL_VERSION));
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // Start drawing with default shader
+
+ DrawText("USING DEFAULT SHADER", 20, 40, 10, RED);
+
+ DrawCircle(80, 120, 35, DARKBLUE);
+ DrawCircleGradient(80, 220, 60, GREEN, SKYBLUE);
+ DrawCircleLines(80, 340, 80, DARKBLUE);
+
+
+ // Activate our custom shader to be applied on next shapes/textures drawings
+ BeginShaderMode(shader);
+
+ DrawText("USING CUSTOM SHADER", 190, 40, 10, RED);
+
+ DrawRectangle(250 - 60, 90, 120, 60, RED);
+ DrawRectangleGradientH(250 - 90, 170, 180, 130, MAROON, GOLD);
+ DrawRectangleLines(250 - 40, 320, 80, 60, ORANGE);
+
+ // Activate our default shader for next drawings
+ EndShaderMode();
+
+ DrawText("USING DEFAULT SHADER", 370, 40, 10, RED);
+
+ DrawTriangle((Vector2){430, 80},
+ (Vector2){430 - 60, 150},
+ (Vector2){430 + 60, 150}, VIOLET);
+
+ DrawTriangleLines((Vector2){430, 160},
+ (Vector2){430 - 20, 230},
+ (Vector2){430 + 20, 230}, DARKBLUE);
+
+ DrawPoly((Vector2){430, 320}, 6, 80, 0, BROWN);
+
+ // Activate our custom shader to be applied on next shapes/textures drawings
+ BeginShaderMode(shader);
+
+ DrawTexture(fudesumi, 500, -30, WHITE); // Using custom shader
+
+ // Activate our default shader for next drawings
+ EndShaderMode();
+
+ DrawText("(c) Fudesumi sprite by Eiden Marsal", 380, screenHeight - 20, 10, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(fudesumi); // Unload texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_shapes_textures.png b/raylib/examples/shaders/shaders_shapes_textures.png
new file mode 100644
index 0000000..63a2283
--- /dev/null
+++ b/raylib/examples/shaders/shaders_shapes_textures.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_simple_mask.c b/raylib/examples/shaders/shaders_simple_mask.c
new file mode 100644
index 0000000..7ed315b
--- /dev/null
+++ b/raylib/examples/shaders/shaders_simple_mask.c
@@ -0,0 +1,150 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Simple shader mask
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.7
+*
+* Example contributed by Chris Camacho (@chriscamacho) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Chris Camacho (@chriscamacho) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************
+*
+* After a model is loaded it has a default material, this material can be
+* modified in place rather than creating one from scratch...
+* While all of the maps have particular names, they can be used for any purpose
+* except for three maps that are applied as cubic maps (see below)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - simple shader mask");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 0.0f, 1.0f, 2.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Define our three models to show the shader on
+ Mesh torus = GenMeshTorus(0.3f, 1, 16, 32);
+ Model model1 = LoadModelFromMesh(torus);
+
+ Mesh cube = GenMeshCube(0.8f,0.8f,0.8f);
+ Model model2 = LoadModelFromMesh(cube);
+
+ // Generate model to be shaded just to see the gaps in the other two
+ Mesh sphere = GenMeshSphere(1, 16, 16);
+ Model model3 = LoadModelFromMesh(sphere);
+
+ // Load the shader
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/mask.fs", GLSL_VERSION));
+
+ // Load and apply the diffuse texture (colour map)
+ Texture texDiffuse = LoadTexture("resources/plasma.png");
+ model1.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texDiffuse;
+ model2.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texDiffuse;
+
+ // Using MATERIAL_MAP_EMISSION as a spare slot to use for 2nd texture
+ // NOTE: Don't use MATERIAL_MAP_IRRADIANCE, MATERIAL_MAP_PREFILTER or MATERIAL_MAP_CUBEMAP as they are bound as cube maps
+ Texture texMask = LoadTexture("resources/mask.png");
+ model1.materials[0].maps[MATERIAL_MAP_EMISSION].texture = texMask;
+ model2.materials[0].maps[MATERIAL_MAP_EMISSION].texture = texMask;
+ shader.locs[SHADER_LOC_MAP_EMISSION] = GetShaderLocation(shader, "mask");
+
+ // Frame is incremented each frame to animate the shader
+ int shaderFrame = GetShaderLocation(shader, "frame");
+
+ // Apply the shader to the two models
+ model1.materials[0].shader = shader;
+ model2.materials[0].shader = shader;
+
+ int framesCounter = 0;
+ Vector3 rotation = { 0 }; // Model rotation angles
+
+ DisableCursor(); // Limit cursor to relative movement inside the window
+ SetTargetFPS(60); // Set to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_FIRST_PERSON);
+
+ framesCounter++;
+ rotation.x += 0.01f;
+ rotation.y += 0.005f;
+ rotation.z -= 0.0025f;
+
+ // Send frames counter to shader for animation
+ SetShaderValue(shader, shaderFrame, &framesCounter, SHADER_UNIFORM_INT);
+
+ // Rotate one of the models
+ model1.transform = MatrixRotateXYZ(rotation);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(DARKBLUE);
+
+ BeginMode3D(camera);
+
+ DrawModel(model1, (Vector3){ 0.5f, 0.0f, 0.0f }, 1, WHITE);
+ DrawModelEx(model2, (Vector3){ -0.5f, 0.0f, 0.0f }, (Vector3){ 1.0f, 1.0f, 0.0f }, 50, (Vector3){ 1.0f, 1.0f, 1.0f }, WHITE);
+ DrawModel(model3,(Vector3){ 0.0f, 0.0f, -1.5f }, 1, WHITE);
+ DrawGrid(10, 1.0f); // Draw a grid
+
+ EndMode3D();
+
+ DrawRectangle(16, 698, MeasureText(TextFormat("Frame: %i", framesCounter), 20) + 8, 42, BLUE);
+ DrawText(TextFormat("Frame: %i", framesCounter), 20, 700, 20, WHITE);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(model1);
+ UnloadModel(model2);
+ UnloadModel(model3);
+
+ UnloadTexture(texDiffuse); // Unload default diffuse texture
+ UnloadTexture(texMask); // Unload texture mask
+
+ UnloadShader(shader); // Unload shader
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_simple_mask.png b/raylib/examples/shaders/shaders_simple_mask.png
new file mode 100644
index 0000000..c97682a
--- /dev/null
+++ b/raylib/examples/shaders/shaders_simple_mask.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_spotlight.c b/raylib/examples/shaders/shaders_spotlight.c
new file mode 100644
index 0000000..067f962
--- /dev/null
+++ b/raylib/examples/shaders/shaders_spotlight.c
@@ -0,0 +1,255 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Simple shader mask
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.7
+*
+* Example contributed by Chris Camacho (@chriscamacho) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Chris Camacho (@chriscamacho) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************
+*
+* The shader makes alpha holes in the forground to give the appearance of a top
+* down look at a spotlight casting a pool of light...
+*
+* The right hand side of the screen there is just enough light to see whats
+* going on without the spot light, great for a stealth type game where you
+* have to avoid the spotlights.
+*
+* The left hand side of the screen is in pitch dark except for where the spotlights are.
+*
+* Although this example doesn't scale like the letterbox example, you could integrate
+* the two techniques, but by scaling the actual colour of the render texture rather
+* than using alpha as a mask.
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+#define MAX_SPOTS 3 // NOTE: It must be the same as define in shader
+#define MAX_STARS 400
+
+// Spot data
+typedef struct Spot {
+ Vector2 position;
+ Vector2 speed;
+ float inner;
+ float radius;
+
+ // Shader locations
+ unsigned int positionLoc;
+ unsigned int innerLoc;
+ unsigned int radiusLoc;
+} Spot;
+
+// Stars in the star field have a position and velocity
+typedef struct Star {
+ Vector2 position;
+ Vector2 speed;
+} Star;
+
+static void UpdateStar(Star *s);
+static void ResetStar(Star *s);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - shader spotlight");
+ HideCursor();
+
+ Texture texRay = LoadTexture("resources/raysan.png");
+
+ Star stars[MAX_STARS] = { 0 };
+
+ for (int n = 0; n < MAX_STARS; n++) ResetStar(&stars[n]);
+
+ // Progress all the stars on, so they don't all start in the centre
+ for (int m = 0; m < screenWidth/2.0; m++)
+ {
+ for (int n = 0; n < MAX_STARS; n++) UpdateStar(&stars[n]);
+ }
+
+ int frameCounter = 0;
+
+ // Use default vert shader
+ Shader shdrSpot = LoadShader(0, TextFormat("resources/shaders/glsl%i/spotlight.fs", GLSL_VERSION));
+
+ // Get the locations of spots in the shader
+ Spot spots[MAX_SPOTS];
+
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ char posName[32] = "spots[x].pos\0";
+ char innerName[32] = "spots[x].inner\0";
+ char radiusName[32] = "spots[x].radius\0";
+
+ posName[6] = '0' + i;
+ innerName[6] = '0' + i;
+ radiusName[6] = '0' + i;
+
+ spots[i].positionLoc = GetShaderLocation(shdrSpot, posName);
+ spots[i].innerLoc = GetShaderLocation(shdrSpot, innerName);
+ spots[i].radiusLoc = GetShaderLocation(shdrSpot, radiusName);
+
+ }
+
+ // Tell the shader how wide the screen is so we can have
+ // a pitch black half and a dimly lit half.
+ unsigned int wLoc = GetShaderLocation(shdrSpot, "screenWidth");
+ float sw = (float)GetScreenWidth();
+ SetShaderValue(shdrSpot, wLoc, &sw, SHADER_UNIFORM_FLOAT);
+
+ // Randomize the locations and velocities of the spotlights
+ // and initialize the shader locations
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ spots[i].position.x = (float)GetRandomValue(64, screenWidth - 64);
+ spots[i].position.y = (float)GetRandomValue(64, screenHeight - 64);
+ spots[i].speed = (Vector2){ 0, 0 };
+
+ while ((fabs(spots[i].speed.x) + fabs(spots[i].speed.y)) < 2)
+ {
+ spots[i].speed.x = GetRandomValue(-400, 40) / 10.0f;
+ spots[i].speed.y = GetRandomValue(-400, 40) / 10.0f;
+ }
+
+ spots[i].inner = 28.0f * (i + 1);
+ spots[i].radius = 48.0f * (i + 1);
+
+ SetShaderValue(shdrSpot, spots[i].positionLoc, &spots[i].position.x, SHADER_UNIFORM_VEC2);
+ SetShaderValue(shdrSpot, spots[i].innerLoc, &spots[i].inner, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shdrSpot, spots[i].radiusLoc, &spots[i].radius, SHADER_UNIFORM_FLOAT);
+ }
+
+ SetTargetFPS(60); // Set to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ frameCounter++;
+
+ // Move the stars, resetting them if the go offscreen
+ for (int n = 0; n < MAX_STARS; n++) UpdateStar(&stars[n]);
+
+ // Update the spots, send them to the shader
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ if (i == 0)
+ {
+ Vector2 mp = GetMousePosition();
+ spots[i].position.x = mp.x;
+ spots[i].position.y = screenHeight - mp.y;
+ }
+ else
+ {
+ spots[i].position.x += spots[i].speed.x;
+ spots[i].position.y += spots[i].speed.y;
+
+ if (spots[i].position.x < 64) spots[i].speed.x = -spots[i].speed.x;
+ if (spots[i].position.x > (screenWidth - 64)) spots[i].speed.x = -spots[i].speed.x;
+ if (spots[i].position.y < 64) spots[i].speed.y = -spots[i].speed.y;
+ if (spots[i].position.y > (screenHeight - 64)) spots[i].speed.y = -spots[i].speed.y;
+ }
+
+ SetShaderValue(shdrSpot, spots[i].positionLoc, &spots[i].position.x, SHADER_UNIFORM_VEC2);
+ }
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(DARKBLUE);
+
+ // Draw stars and bobs
+ for (int n = 0; n < MAX_STARS; n++)
+ {
+ // Single pixel is just too small these days!
+ DrawRectangle((int)stars[n].position.x, (int)stars[n].position.y, 2, 2, WHITE);
+ }
+
+ for (int i = 0; i < 16; i++)
+ {
+ DrawTexture(texRay,
+ (int)((screenWidth/2.0f) + cos((frameCounter + i*8)/51.45f)*(screenWidth/2.2f) - 32),
+ (int)((screenHeight/2.0f) + sin((frameCounter + i*8)/17.87f)*(screenHeight/4.2f)), WHITE);
+ }
+
+ // Draw spot lights
+ BeginShaderMode(shdrSpot);
+ // Instead of a blank rectangle you could render here
+ // a render texture of the full screen used to do screen
+ // scaling (slight adjustment to shader would be required
+ // to actually pay attention to the colour!)
+ DrawRectangle(0, 0, screenWidth, screenHeight, WHITE);
+ EndShaderMode();
+
+ DrawFPS(10, 10);
+
+ DrawText("Move the mouse!", 10, 30, 20, GREEN);
+ DrawText("Pitch Black", (int)(screenWidth*0.2f), screenHeight/2, 20, GREEN);
+ DrawText("Dark", (int)(screenWidth*.66f), screenHeight/2, 20, GREEN);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadTexture(texRay);
+ UnloadShader(shdrSpot);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+
+static void ResetStar(Star *s)
+{
+ s->position = (Vector2){ GetScreenWidth()/2.0f, GetScreenHeight()/2.0f };
+
+ do
+ {
+ s->speed.x = (float)GetRandomValue(-1000, 1000)/100.0f;
+ s->speed.y = (float)GetRandomValue(-1000, 1000)/100.0f;
+
+ } while (!(fabs(s->speed.x) + (fabs(s->speed.y) > 1)));
+
+ s->position = Vector2Add(s->position, Vector2Multiply(s->speed, (Vector2){ 8.0f, 8.0f }));
+}
+
+static void UpdateStar(Star *s)
+{
+ s->position = Vector2Add(s->position, s->speed);
+
+ if ((s->position.x < 0) || (s->position.x > GetScreenWidth()) ||
+ (s->position.y < 0) || (s->position.y > GetScreenHeight()))
+ {
+ ResetStar(s);
+ }
+}
+
+
diff --git a/raylib/examples/shaders/shaders_spotlight.png b/raylib/examples/shaders/shaders_spotlight.png
new file mode 100644
index 0000000..424a56c
--- /dev/null
+++ b/raylib/examples/shaders/shaders_spotlight.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_texture_drawing.c b/raylib/examples/shaders/shaders_texture_drawing.c
new file mode 100644
index 0000000..43ffa21
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_drawing.c
@@ -0,0 +1,85 @@
+/*******************************************************************************************
+*
+* raylib [textures] example - Texture drawing
+*
+* NOTE: This example illustrates how to draw into a blank texture using a shader
+*
+* Example originally created with raylib 2.0, last time updated with raylib 3.7
+*
+* Example contributed by Michał Ciesielski and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Michał Ciesielski and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - texture drawing");
+
+ Image imBlank = GenImageColor(1024, 1024, BLANK);
+ Texture2D texture = LoadTextureFromImage(imBlank); // Load blank texture to fill on shader
+ UnloadImage(imBlank);
+
+ // NOTE: Using GLSL 330 shader version, on OpenGL ES 2.0 use GLSL 100 shader version
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/cubes_panning.fs", GLSL_VERSION));
+
+ float time = 0.0f;
+ int timeLoc = GetShaderLocation(shader, "uTime");
+ SetShaderValue(shader, timeLoc, &time, SHADER_UNIFORM_FLOAT);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ // -------------------------------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ time = (float)GetTime();
+ SetShaderValue(shader, timeLoc, &time, SHADER_UNIFORM_FLOAT);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginShaderMode(shader); // Enable our custom shader for next shapes/textures drawings
+ DrawTexture(texture, 0, 0, WHITE); // Drawing BLANK texture, all magic happens on shader
+ EndShaderMode(); // Disable our custom shader, return to default shader
+
+ DrawText("BACKGROUND is PAINTED and ANIMATED on SHADER!", 10, 10, 20, MAROON);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_texture_drawing.png b/raylib/examples/shaders/shaders_texture_drawing.png
new file mode 100644
index 0000000..12df6fa
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_drawing.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_texture_outline.c b/raylib/examples/shaders/shaders_texture_outline.c
new file mode 100644
index 0000000..83f2820
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_outline.c
@@ -0,0 +1,102 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Apply an shdrOutline to a texture
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* Example originally created with raylib 4.0, last time updated with raylib 4.0
+*
+* Example contributed by Samuel Skiff (@GoldenThumbs) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2021-2023 Samuel SKiff (@GoldenThumbs) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - Apply an outline to a texture");
+
+ Texture2D texture = LoadTexture("resources/fudesumi.png");
+
+ Shader shdrOutline = LoadShader(0, TextFormat("resources/shaders/glsl%i/outline.fs", GLSL_VERSION));
+
+ float outlineSize = 2.0f;
+ float outlineColor[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; // Normalized RED color
+ float textureSize[2] = { (float)texture.width, (float)texture.height };
+
+ // Get shader locations
+ int outlineSizeLoc = GetShaderLocation(shdrOutline, "outlineSize");
+ int outlineColorLoc = GetShaderLocation(shdrOutline, "outlineColor");
+ int textureSizeLoc = GetShaderLocation(shdrOutline, "textureSize");
+
+ // Set shader values (they can be changed later)
+ SetShaderValue(shdrOutline, outlineSizeLoc, &outlineSize, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shdrOutline, outlineColorLoc, outlineColor, SHADER_UNIFORM_VEC4);
+ SetShaderValue(shdrOutline, textureSizeLoc, textureSize, SHADER_UNIFORM_VEC2);
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ outlineSize += GetMouseWheelMove();
+ if (outlineSize < 1.0f) outlineSize = 1.0f;
+
+ SetShaderValue(shdrOutline, outlineSizeLoc, &outlineSize, SHADER_UNIFORM_FLOAT);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginShaderMode(shdrOutline);
+
+ DrawTexture(texture, GetScreenWidth()/2 - texture.width/2, -30, WHITE);
+
+ EndShaderMode();
+
+ DrawText("Shader-based\ntexture\noutline", 10, 10, 20, GRAY);
+ DrawText("Scroll mouse wheel to\nchange outline size", 10, 72, 20, GRAY);
+ DrawText(TextFormat("Outline size: %i px", (int)outlineSize), 10, 120, 20, MAROON);
+
+ DrawFPS(710, 10);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadTexture(texture);
+ UnloadShader(shdrOutline);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_texture_outline.png b/raylib/examples/shaders/shaders_texture_outline.png
new file mode 100644
index 0000000..badd388
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_outline.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_texture_waves.c b/raylib/examples/shaders/shaders_texture_waves.c
new file mode 100644
index 0000000..5bdaada
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_waves.c
@@ -0,0 +1,115 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Texture Waves
+*
+* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
+* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
+*
+* NOTE: Shaders used in this example are #version 330 (OpenGL 3.3), to test this example
+* on OpenGL ES 2.0 platforms (Android, Raspberry Pi, HTML5), use #version 100 shaders
+* raylib comes with shaders ready for both versions, check raylib/shaders install folder
+*
+* Example originally created with raylib 2.5, last time updated with raylib 3.7
+*
+* Example contributed by Anata (@anatagawa) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2019-2023 Anata (@anatagawa) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#if defined(PLATFORM_DESKTOP)
+ #define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+ #define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - texture waves");
+
+ // Load texture texture to apply shaders
+ Texture2D texture = LoadTexture("resources/space.png");
+
+ // Load shader and setup location points and values
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/wave.fs", GLSL_VERSION));
+
+ int secondsLoc = GetShaderLocation(shader, "seconds");
+ int freqXLoc = GetShaderLocation(shader, "freqX");
+ int freqYLoc = GetShaderLocation(shader, "freqY");
+ int ampXLoc = GetShaderLocation(shader, "ampX");
+ int ampYLoc = GetShaderLocation(shader, "ampY");
+ int speedXLoc = GetShaderLocation(shader, "speedX");
+ int speedYLoc = GetShaderLocation(shader, "speedY");
+
+ // Shader uniform values that can be updated at any time
+ float freqX = 25.0f;
+ float freqY = 25.0f;
+ float ampX = 5.0f;
+ float ampY = 5.0f;
+ float speedX = 8.0f;
+ float speedY = 8.0f;
+
+ float screenSize[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
+ SetShaderValue(shader, GetShaderLocation(shader, "size"), &screenSize, SHADER_UNIFORM_VEC2);
+ SetShaderValue(shader, freqXLoc, &freqX, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, freqYLoc, &freqY, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, ampXLoc, &ampX, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, ampYLoc, &ampY, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, speedXLoc, &speedX, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, speedYLoc, &speedY, SHADER_UNIFORM_FLOAT);
+
+ float seconds = 0.0f;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ // -------------------------------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ seconds += GetFrameTime();
+
+ SetShaderValue(shader, secondsLoc, &seconds, SHADER_UNIFORM_FLOAT);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginShaderMode(shader);
+
+ DrawTexture(texture, 0, 0, WHITE);
+ DrawTexture(texture, texture.width, 0, WHITE);
+
+ EndShaderMode();
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(texture); // Unload texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_texture_waves.png b/raylib/examples/shaders/shaders_texture_waves.png
new file mode 100644
index 0000000..99781a1
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_waves.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_write_depth.c b/raylib/examples/shaders/shaders_write_depth.c
new file mode 100644
index 0000000..d9e40d0
--- /dev/null
+++ b/raylib/examples/shaders/shaders_write_depth.c
@@ -0,0 +1,167 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - Depth buffer writing
+*
+* Example originally created with raylib 4.2, last time updated with raylib 4.2
+*
+* Example contributed by Buğra Alptekin Sarı (@BugraAlptekinSari) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2022-2023 Buğra Alptekin Sarı (@BugraAlptekinSari)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "rlgl.h"
+
+#if defined(PLATFORM_DESKTOP)
+#define GLSL_VERSION 330
+#else // PLATFORM_ANDROID, PLATFORM_WEB
+#define GLSL_VERSION 100
+#endif
+
+//------------------------------------------------------------------------------------
+// Declare custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+static RenderTexture2D LoadRenderTextureDepthTex(int width, int height);
+
+// Unload render texture from GPU memory (VRAM)
+static void UnloadRenderTextureDepthTex(RenderTexture2D target);
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - write depth buffer");
+
+ // The shader inverts the depth buffer by writing into it by `gl_FragDepth = 1 - gl_FragCoord.z;`
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/write_depth.fs", GLSL_VERSION));
+
+ // Use Customized function to create writable depth texture buffer
+ RenderTexture2D target = LoadRenderTextureDepthTex(screenWidth, screenHeight);
+
+ // Define the camera to look into our 3d world
+ Camera camera = {
+ .position = (Vector3){ 2.0f, 2.0f, 3.0f }, // Camera position
+ .target = (Vector3){ 0.0f, 0.5f, 0.0f }, // Camera looking at point
+ .up = (Vector3){ 0.0f, 1.0f, 0.0f }, // Camera up vector (rotation towards target)
+ .fovy = 45.0f, // Camera field-of-view Y
+ .projection = CAMERA_PERSPECTIVE // Camera projection type
+ };
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+
+ // Draw into our custom render texture (framebuffer)
+ BeginTextureMode(target);
+ ClearBackground(WHITE);
+
+ BeginMode3D(camera);
+ BeginShaderMode(shader);
+ DrawCubeWiresV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, RED);
+ DrawCubeV((Vector3){ 0.0f, 0.5f, 1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, PURPLE);
+ DrawCubeWiresV((Vector3){ 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, DARKGREEN);
+ DrawCubeV((Vector3) { 0.0f, 0.5f, -1.0f }, (Vector3){ 1.0f, 1.0f, 1.0f }, YELLOW);
+ DrawGrid(10, 1.0f);
+ EndShaderMode();
+ EndMode3D();
+ EndTextureMode();
+
+ // Draw into screen our custom render texture
+ BeginDrawing();
+ ClearBackground(RAYWHITE);
+
+ DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
+ DrawFPS(10, 10);
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadRenderTextureDepthTex(target);
+ UnloadShader(shader);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------------
+// Define custom functions required for the example
+//------------------------------------------------------------------------------------
+// Load custom render texture, create a writable depth texture buffer
+RenderTexture2D LoadRenderTextureDepthTex(int width, int height)
+{
+ RenderTexture2D target = { 0 };
+
+ target.id = rlLoadFramebuffer(width, height); // Load an empty framebuffer
+
+ if (target.id > 0)
+ {
+ rlEnableFramebuffer(target.id);
+
+ // Create color texture (default to RGBA)
+ target.texture.id = rlLoadTexture(0, width, height, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
+ target.texture.width = width;
+ target.texture.height = height;
+ target.texture.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
+ target.texture.mipmaps = 1;
+
+ // Create depth texture buffer (instead of raylib default renderbuffer)
+ target.depth.id = rlLoadTextureDepth(width, height, false);
+ target.depth.width = width;
+ target.depth.height = height;
+ target.depth.format = 19; //DEPTH_COMPONENT_24BIT?
+ target.depth.mipmaps = 1;
+
+ // Attach color texture and depth texture to FBO
+ rlFramebufferAttach(target.id, target.texture.id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0);
+ rlFramebufferAttach(target.id, target.depth.id, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_TEXTURE2D, 0);
+
+ // Check if fbo is complete with attachments (valid)
+ if (rlFramebufferComplete(target.id)) TRACELOG(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", target.id);
+
+ rlDisableFramebuffer();
+ }
+ else TRACELOG(LOG_WARNING, "FBO: Framebuffer object can not be created");
+
+ return target;
+}
+
+// Unload render texture from GPU memory (VRAM)
+void UnloadRenderTextureDepthTex(RenderTexture2D target)
+{
+ if (target.id > 0)
+ {
+ // Color texture attached to FBO is deleted
+ rlUnloadTexture(target.texture.id);
+ rlUnloadTexture(target.depth.id);
+
+ // NOTE: Depth texture is automatically
+ // queried and deleted before deleting framebuffer
+ rlUnloadFramebuffer(target.id);
+ }
+} \ No newline at end of file
diff --git a/raylib/examples/shaders/shaders_write_depth.png b/raylib/examples/shaders/shaders_write_depth.png
new file mode 100644
index 0000000..5a56d7d
--- /dev/null
+++ b/raylib/examples/shaders/shaders_write_depth.png
Binary files differ