summaryrefslogtreecommitdiff
path: root/drivers/gles3/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gles3/shaders')
-rw-r--r--drivers/gles3/shaders/canvas.glsl10
-rw-r--r--drivers/gles3/shaders/scene.glsl107
-rw-r--r--drivers/gles3/shaders/sky.glsl41
-rw-r--r--drivers/gles3/shaders/stdlib_inc.glsl3
-rw-r--r--drivers/gles3/shaders/tonemap_inc.glsl10
5 files changed, 84 insertions, 87 deletions
diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl
index f121679833..381a0e8a73 100644
--- a/drivers/gles3/shaders/canvas.glsl
+++ b/drivers/gles3/shaders/canvas.glsl
@@ -518,8 +518,8 @@ void main() {
float px_size = max(0.5 * dot((vec2(px_range) / msdf_size), dest_size), 1.0);
float d = msdf_median(msdf_sample.r, msdf_sample.g, msdf_sample.b, msdf_sample.a) - 0.5;
- if (outline_thickness > 0) {
- float cr = clamp(outline_thickness, 0.0, px_range / 2) / px_range;
+ if (outline_thickness > 0.0) {
+ float cr = clamp(outline_thickness, 0.0, px_range / 2.0) / px_range;
float a = clamp((d + cr) * px_size, 0.0, 1.0);
color.a = a * color.a;
} else {
@@ -710,8 +710,8 @@ void main() {
vec2 pos_rot = pos_norm * mat2(vec2(0.7071067811865476, -0.7071067811865476), vec2(0.7071067811865476, 0.7071067811865476)); //is there a faster way to 45 degrees rot?
float tex_ofs;
float distance;
- if (pos_rot.y > 0) {
- if (pos_rot.x > 0) {
+ if (pos_rot.y > 0.0) {
+ if (pos_rot.x > 0.0) {
tex_ofs = pos_box.y * 0.125 + 0.125;
distance = shadow_pos.x;
} else {
@@ -719,7 +719,7 @@ void main() {
distance = shadow_pos.y;
}
} else {
- if (pos_rot.x < 0) {
+ if (pos_rot.x < 0.0) {
tex_ofs = pos_box.y * -0.125 + (0.5 + 0.125);
distance = -shadow_pos.x;
} else {
diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl
index 16a9224fbb..ea28685be7 100644
--- a/drivers/gles3/shaders/scene.glsl
+++ b/drivers/gles3/shaders/scene.glsl
@@ -20,13 +20,19 @@ USE_LIGHT_POSITIONAL = false
#include "stdlib_inc.glsl"
+#if !defined(MODE_RENDER_DEPTH) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) ||defined(LIGHT_CLEARCOAT_USED)
+#ifndef NORMAL_USED
+#define NORMAL_USED
+#endif
+#endif
+
/*
from RenderingServer:
ARRAY_VERTEX = 0, // RG32F or RGB32F (depending on 2D bit)
+ARRAY_NORMAL = 1, // A2B10G10R10, A is ignored.
+ARRAY_TANGENT = 2, // A2B10G10R10, A flips sign of binormal.
ARRAY_COLOR = 3, // RGBA8
ARRAY_TEX_UV = 4, // RG32F
-ARRAY_TANGENT = 2, // A2B10G10R10, A flips sign of binormal.
-ARRAY_NORMAL = 1, // A2B10G10R10, A is ignored.
ARRAY_TEX_UV2 = 5, // RG32F
ARRAY_CUSTOM0 = 6, // Depends on ArrayCustomFormat.
ARRAY_CUSTOM1 = 7,
@@ -40,7 +46,7 @@ ARRAY_MAX = 13
/* INPUT ATTRIBS */
-layout(location = 0) in vec3 vertex_attrib;
+layout(location = 0) in highp vec3 vertex_attrib;
/* clang-format on */
#ifdef NORMAL_USED
@@ -79,19 +85,23 @@ layout(location = 8) in vec4 custom2_attrib;
layout(location = 9) in vec4 custom3_attrib;
#endif
-#if defined(BONES_USED) || defined(USE_PARTICLE_TRAILS)
+#if defined(BONES_USED)
layout(location = 10) in uvec4 bone_attrib;
#endif
-#if defined(WEIGHTS_USED) || defined(USE_PARTICLE_TRAILS)
+#if defined(WEIGHTS_USED)
layout(location = 11) in vec4 weight_attrib;
#endif
-layout(std140) uniform SceneData { // ubo:3
- mat4 projection_matrix;
- mat4 inv_projection_matrix;
- mat4 inv_view_matrix;
- mat4 view_matrix;
+layout(std140) uniform GlobalVariableData { //ubo:1
+ vec4 global_variables[MAX_GLOBAL_VARIABLES];
+};
+
+layout(std140) uniform SceneData { // ubo:2
+ highp mat4 projection_matrix;
+ highp mat4 inv_projection_matrix;
+ highp mat4 inv_view_matrix;
+ highp mat4 view_matrix;
vec2 viewport_size;
vec2 screen_pixel_size;
@@ -143,15 +153,15 @@ out highp vec3 vertex_interp;
out vec3 normal_interp;
#endif
-#if defined(ENABLE_COLOR_INTERP)
+#if defined(COLOR_USED)
out vec4 color_interp;
#endif
-#if defined(ENABLE_UV_INTERP)
+#if defined(UV_USED)
out vec2 uv_interp;
#endif
-#if defined(ENABLE_UV2_INTERP)
+#if defined(UV2_USED)
out vec2 uv2_interp;
#else
#ifdef USE_LIGHTMAP
@@ -159,15 +169,15 @@ out vec2 uv2_interp;
#endif
#endif
-#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
+#if defined(TANGENT_USED) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
out vec3 tangent_interp;
out vec3 binormal_interp;
#endif
-#if defined(USE_MATERIAL)
+#if defined(MATERIAL_UNIFORMS_USED)
/* clang-format off */
-layout(std140) uniform UniformData { // ubo:1
+layout(std140) uniform MaterialUniforms { // ubo:3
#MATERIAL_UNIFORMS
@@ -194,31 +204,31 @@ void main() {
#ifdef NORMAL_USED
vec3 normal = normal_attrib * 2.0 - 1.0;
#endif
- mat3 model_normal_matrix = mat3(model_matrix);
+ highp mat3 model_normal_matrix = mat3(model_matrix);
-#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
+#if defined(TANGENT_USED) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
vec3 tangent;
float binormalf;
tangent = normal_tangent_attrib.xyz;
binormalf = normal_tangent_attrib.a;
#endif
-#if defined(ENABLE_COLOR_INTERP)
+#if defined(COLOR_USED)
color_interp = color_attrib;
#endif
-#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
+#if defined(TANGENT_USED) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
vec3 binormal = normalize(cross(normal, tangent) * binormalf);
#endif
-#if defined(ENABLE_UV_INTERP)
+#if defined(UV_USED)
uv_interp = uv_attrib;
#endif
#ifdef USE_LIGHTMAP
uv2_interp = lightmap_uv_rect.zw * uv2_attrib + lightmap_uv_rect.xy;
#else
-#if defined(ENABLE_UV2_INTERP)
+#if defined(UV2_USED)
uv2_interp = uv2_attrib;
#endif
#endif
@@ -226,8 +236,8 @@ void main() {
#if defined(OVERRIDE_POSITION)
highp vec4 position;
#endif
- mat4 projection_matrix = scene_data.projection_matrix;
- mat4 inv_projection_matrix = scene_data.inv_projection_matrix;
+ highp mat4 projection_matrix = scene_data.projection_matrix;
+ highp mat4 inv_projection_matrix = scene_data.inv_projection_matrix;
vec4 instance_custom = vec4(0.0);
@@ -250,8 +260,8 @@ void main() {
float roughness = 1.0;
- mat4 modelview = scene_data.view_matrix * model_matrix;
- mat3 modelview_normal = mat3(scene_data.view_matrix) * model_normal_matrix;
+ highp mat4 modelview = scene_data.view_matrix * model_matrix;
+ highp mat3 modelview_normal = mat3(scene_data.view_matrix) * model_normal_matrix;
float point_size = 1.0;
@@ -296,7 +306,7 @@ void main() {
normal_interp = normal;
#endif
-#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
+#if defined(TANGENT_USED) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
tangent_interp = tangent;
binormal_interp = binormal;
#endif
@@ -327,7 +337,7 @@ void main() {
#define SPECULAR_SCHLICK_GGX
#endif
-#if !defined(MODE_RENDER_DEPTH) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED)
+#if !defined(MODE_RENDER_DEPTH) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) ||defined(LIGHT_CLEARCOAT_USED)
#ifndef NORMAL_USED
#define NORMAL_USED
#endif
@@ -351,19 +361,19 @@ uniform highp mat4 world_transform;
/* clang-format on */
#define M_PI 3.14159265359
-#define SHADER_IS_SRGB false
+#define SHADER_IS_SRGB true
/* Varyings */
-#if defined(ENABLE_COLOR_INTERP)
+#if defined(COLOR_USED)
in vec4 color_interp;
#endif
-#if defined(ENABLE_UV_INTERP)
+#if defined(UV_USED)
in vec2 uv_interp;
#endif
-#if defined(ENABLE_UV2_INTERP)
+#if defined(UV2_USED)
in vec2 uv2_interp;
#else
#ifdef USE_LIGHTMAP
@@ -371,19 +381,22 @@ in vec2 uv2_interp;
#endif
#endif
-#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
+#if defined(TANGENT_USED) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
in vec3 tangent_interp;
in vec3 binormal_interp;
#endif
-in highp vec3 vertex_interp;
+#ifdef NORMAL_USED
in vec3 normal_interp;
+#endif
+
+in highp vec3 vertex_interp;
/* PBR CHANNELS */
#ifdef USE_RADIANCE_MAP
-layout(std140) uniform Radiance { // ubo:2
+layout(std140) uniform Radiance { // ubo:4
mat4 radiance_inverse_xform;
float radiance_ambient_contribution;
@@ -405,12 +418,16 @@ vec3 textureDualParaboloid(sampler2D p_tex, vec3 p_vec, float p_roughness) {
#endif
-/* Material Uniforms */
+layout(std140) uniform GlobalVariableData { //ubo:1
+ vec4 global_variables[MAX_GLOBAL_VARIABLES];
+};
+
+ /* Material Uniforms */
-#if defined(USE_MATERIAL)
+#if defined(MATERIAL_UNIFORMS_USED)
/* clang-format off */
-layout(std140) uniform UniformData {
+layout(std140) uniform MaterialUniforms { // ubo:3
#MATERIAL_UNIFORMS
@@ -419,11 +436,11 @@ layout(std140) uniform UniformData {
#endif
-layout(std140) uniform SceneData { // ubo:3
- mat4 projection_matrix;
- mat4 inv_projection_matrix;
- mat4 inv_view_matrix;
- mat4 view_matrix;
+layout(std140) uniform SceneData { // ubo:2
+ highp mat4 projection_matrix;
+ highp mat4 inv_projection_matrix;
+ highp mat4 inv_view_matrix;
+ highp mat4 view_matrix;
vec2 viewport_size;
vec2 screen_pixel_size;
@@ -501,12 +518,12 @@ struct LightData { //this structure needs to be as packed as possible
bool shadow_enabled;
};
-layout(std140) uniform OmniLightData { // ubo:4
+layout(std140) uniform OmniLightData { // ubo:5
LightData omni_lights[MAX_LIGHT_DATA_STRUCTS];
};
-layout(std140) uniform SpotLightData { // ubo:5
+layout(std140) uniform SpotLightData { // ubo:6
LightData spot_lights[MAX_LIGHT_DATA_STRUCTS];
};
diff --git a/drivers/gles3/shaders/sky.glsl b/drivers/gles3/shaders/sky.glsl
index a8e5daafa1..3a1bcd3b28 100644
--- a/drivers/gles3/shaders/sky.glsl
+++ b/drivers/gles3/shaders/sky.glsl
@@ -12,23 +12,14 @@ mode_cubemap_quarter_res = #define USE_CUBEMAP_PASS \n#define USE_QUARTER_RES_PA
#[vertex]
-#ifdef USE_GLES_OVER_GL
-#define lowp
-#define mediump
-#define highp
-#else
-precision highp float;
-precision highp int;
-#endif
-
out vec2 uv_interp;
/* clang-format on */
void main() {
// One big triangle to cover the whole screen
- vec2 base_arr[3] = vec2[](vec2(-1.0, -1.0), vec2(-1.0, 3.0), vec2(3.0, -1.0));
+ vec2 base_arr[3] = vec2[](vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));
uv_interp = base_arr[gl_VertexID];
- gl_Position = vec4(uv_interp, 0.0, 1.0);
+ gl_Position = vec4(uv_interp, 1.0, 1.0);
}
/* clang-format off */
@@ -36,20 +27,6 @@ void main() {
#define M_PI 3.14159265359
-#ifdef USE_GLES_OVER_GL
-#define lowp
-#define mediump
-#define highp
-#else
-#if defined(USE_HIGHP_PRECISION)
-precision highp float;
-precision highp int;
-#else
-precision mediump float;
-precision mediump int;
-#endif
-#endif
-
#include "tonemap_inc.glsl"
in vec2 uv_interp;
@@ -65,22 +42,22 @@ uniform sampler2D half_res; //texunit:-2
uniform sampler2D quarter_res; //texunit:-3
#endif
-layout(std140) uniform SceneData { //ubo:0
- float pad1;
- float pad2;
-};
-
layout(std140) uniform GlobalVariableData { //ubo:1
vec4 global_variables[MAX_GLOBAL_VARIABLES];
};
+layout(std140) uniform SceneData { //ubo:2
+ float pad1;
+ float pad2;
+};
+
struct DirectionalLightData {
vec4 direction_energy;
vec4 color_size;
bool enabled;
};
-layout(std140) uniform DirectionalLights { //ubo:2
+layout(std140) uniform DirectionalLights { //ubo:3
DirectionalLightData data[MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS];
}
directional_lights;
@@ -88,7 +65,7 @@ directional_lights;
/* clang-format off */
#ifdef MATERIAL_UNIFORMS_USED
-layout(std140) uniform MaterialUniforms{ //ubo:3
+layout(std140) uniform MaterialUniforms{ //ubo:4
#MATERIAL_UNIFORMS
diff --git a/drivers/gles3/shaders/stdlib_inc.glsl b/drivers/gles3/shaders/stdlib_inc.glsl
index 3d976e9ab8..6cce6c12bd 100644
--- a/drivers/gles3/shaders/stdlib_inc.glsl
+++ b/drivers/gles3/shaders/stdlib_inc.glsl
@@ -1,5 +1,6 @@
#ifdef USE_GLES_OVER_GL
+// Floating point pack/unpack functions are part of the GLSL ES 300 specification used by web and mobile.
uint float2half(uint f) {
return ((f >> uint(16)) & uint(0x8000)) |
((((f & uint(0x7f800000)) - uint(0x38000000)) >> uint(13)) & uint(0x7c00)) |
@@ -37,6 +38,7 @@ vec2 unpackSnorm2x16(uint p) {
vec2 v = vec2(float(p & uint(0xffff)), float(p >> uint(16)));
return clamp((v - 32767.0) * vec2(0.00003051851), vec2(-1.0), vec2(1.0));
}
+#endif
uint packUnorm4x8(vec4 v) {
uvec4 uv = uvec4(round(clamp(v, vec4(0.0), vec4(1.0)) * 255.0));
@@ -56,4 +58,3 @@ vec4 unpackSnorm4x8(uint p) {
vec4 v = vec4(float(p & uint(0xffff)), float((p >> uint(8)) & uint(0xffff)), float((p >> uint(16)) & uint(0xffff)), float(p >> uint(24)));
return clamp((v - vec4(127.0)) * vec4(0.00787401574), vec4(-1.0), vec4(1.0));
}
-#endif
diff --git a/drivers/gles3/shaders/tonemap_inc.glsl b/drivers/gles3/shaders/tonemap_inc.glsl
index b993f5d97b..ea15c05359 100644
--- a/drivers/gles3/shaders/tonemap_inc.glsl
+++ b/drivers/gles3/shaders/tonemap_inc.glsl
@@ -10,10 +10,12 @@ uniform sampler3D source_color_correction; //texunit:-1
#endif
#endif
-// These could be grouped into some form of SceneData UBO along with time, will have to test performance though
-uniform int tonemapper;
-uniform float exposure;
-uniform float white;
+layout(std140) uniform TonemapData { //ubo:0
+ float exposure;
+ float white;
+ int tonemapper;
+ int pad;
+};
vec3 apply_bcs(vec3 color, vec3 bcs) {
color = mix(vec3(0.0), color, bcs.x);