diff options
author | clayjohn <claynjohn@gmail.com> | 2022-05-10 10:02:44 -0700 |
---|---|---|
committer | clayjohn <claynjohn@gmail.com> | 2022-05-12 10:37:27 -0700 |
commit | 652adcd5bfc569b93d8da3d1539f9a030d065eb7 (patch) | |
tree | a6f211776d4c111a0c1247c5390fd9877ff301f5 /drivers/gles3/shaders | |
parent | 2bf8831dd62c7ef4977a23e93cb58a9d1f929bd9 (diff) |
Basic 3D rendering
Diffstat (limited to 'drivers/gles3/shaders')
-rw-r--r-- | drivers/gles3/shaders/canvas.glsl | 10 | ||||
-rw-r--r-- | drivers/gles3/shaders/scene.glsl | 107 | ||||
-rw-r--r-- | drivers/gles3/shaders/sky.glsl | 41 | ||||
-rw-r--r-- | drivers/gles3/shaders/stdlib_inc.glsl | 3 | ||||
-rw-r--r-- | drivers/gles3/shaders/tonemap_inc.glsl | 10 |
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); |