cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=28d69200f9bba968e51941b302869d205e2eb13c
commit 28d69200f9bba968e51941b302869d205e2eb13c Author: Oleksandr Shcherbina <o.shcherb...@samsung.com> Date: Mon Sep 21 23:41:25 2015 +0200 evas_canvas3d: sets for shadow rendering Summary: Add possibility change quality and offsets for shadow. Add mesh API's to sets size, step and bias constant. Add scene API to sets depth values. Reviewers: Hermet, cedric Reviewed By: cedric Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D3056 Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> --- src/lib/evas/canvas/evas_canvas3d_mesh.c | 39 ++++++ src/lib/evas/canvas/evas_canvas3d_mesh.eo | 26 ++++ src/lib/evas/canvas/evas_canvas3d_scene.c | 19 +++ src/lib/evas/canvas/evas_canvas3d_scene.eo | 15 +++ src/lib/evas/canvas/evas_object_image.c | 2 + src/lib/evas/canvas/evas_types.eot | 3 + src/lib/evas/include/evas_private.h | 11 ++ src/modules/evas/engines/gl_common/evas_gl_3d.c | 11 +- .../evas/engines/gl_common/evas_gl_3d_private.h | 6 + .../evas/engines/gl_common/evas_gl_3d_shader.c | 21 +++ .../gl_common/shader_3d/evas_gl_3d_shaders.x | 146 ++++++++++++--------- .../evas/engines/gl_common/shader_3d/flat_frag.shd | 2 +- .../evas/engines/gl_common/shader_3d/include.shd | 28 ++-- .../gl_common/shader_3d/normal_map_frag.shd | 2 +- .../shader_3d/parallax_occlusion_frag.shd | 2 +- .../engines/gl_common/shader_3d/phong_frag.shd | 2 +- 16 files changed, 253 insertions(+), 82 deletions(-) diff --git a/src/lib/evas/canvas/evas_canvas3d_mesh.c b/src/lib/evas/canvas/evas_canvas3d_mesh.c index c6082ea..892ecd1 100644 --- a/src/lib/evas/canvas/evas_canvas3d_mesh.c +++ b/src/lib/evas/canvas/evas_canvas3d_mesh.c @@ -132,6 +132,9 @@ _mesh_init(Evas_Canvas3D_Mesh_Data *pd) pd->color_pick_key.b = 0.0; #endif pd->color_pick_enabled = EINA_FALSE; + pd->shadows_edges_filtering_level = 4; + pd->shadows_edges_size = 300.0; + pd->shadows_constant_bias = 0.00015; } static inline void @@ -1078,4 +1081,40 @@ _evas_canvas3d_mesh_color_pick_enable_set(Eo *obj, Evas_Canvas3D_Mesh_Data *pd, eo_do(obj, evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_COLOR_PICK, NULL)); } +EOLIAN static void +_evas_canvas3d_mesh_shadows_edges_filtering_set(Eo *obj, Evas_Canvas3D_Mesh_Data *pd, + int blur_level, Evas_Real edges_size) +{ + if (blur_level > 0) + pd->shadows_edges_filtering_level = blur_level; + if (edges_size >= 0) + pd->shadows_edges_size = edges_size; + eo_do(obj, evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_SHADOWS_EDGES_FILTERING, NULL)); +} + +EOLIAN static void +_evas_canvas3d_mesh_shadows_edges_filtering_get(Eo *obj EINA_UNUSED, Evas_Canvas3D_Mesh_Data *pd, + int *blur_level, Evas_Real *edges_size) +{ + if (blur_level) *blur_level = pd->shadows_edges_filtering_level; + if (edges_size) *edges_size = pd->shadows_edges_size; +} + +EOLIAN static void +_evas_canvas3d_mesh_shadows_constant_bias_set(Eo *obj EINA_UNUSED, Evas_Canvas3D_Mesh_Data *pd, + Evas_Real bias) +{ + if (pd->shadows_constant_bias != bias) + { + pd->shadows_constant_bias = bias; + eo_do(obj, evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_MESH_SHADOWS_CONSTANT_BIAS, NULL)); + } +} + +EOLIAN static Evas_Real +_evas_canvas3d_mesh_shadows_constant_bias_get(Eo *obj EINA_UNUSED, Evas_Canvas3D_Mesh_Data *pd) +{ + return pd->shadows_constant_bias; +} + #include "canvas/evas_canvas3d_mesh.eo.c" diff --git a/src/lib/evas/canvas/evas_canvas3d_mesh.eo b/src/lib/evas/canvas/evas_canvas3d_mesh.eo index d0faf59..aa1a23e 100644 --- a/src/lib/evas/canvas/evas_canvas3d_mesh.eo +++ b/src/lib/evas/canvas/evas_canvas3d_mesh.eo @@ -360,7 +360,33 @@ class Evas.Canvas3D.Mesh (Evas.Canvas3D.Object, Evas.Common_Interface, Efl.File) assembly: Evas.Canvas3D.Vertex_Assembly; [[The vertex assembly.]] } } + @property shadows_edges_filtering { + set { + [[Set the shadow edges blur parameters. + The averaging values in window is used for blurring. + User can set the size of window and num of points in window. + ]] + } + get { + [[Get the shadow edges blur parameters.]] + } + values { + blur_level: int; [[Number of points within a bluring radius.]] + edges_size: Evas.Real; [[The bluring radius.]] + } + } + @property shadows_constant_bias { + set { + [[Set offset shadow toward object.]] + } + get { + [[Get offset shadow toward object.]] + } + values { + bias: Evas.Real; [[Offset.]] + } + } } implements { Eo.Base.constructor; diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.c b/src/lib/evas/canvas/evas_canvas3d_scene.c index 518bcbe..13dd68a 100644 --- a/src/lib/evas/canvas/evas_canvas3d_scene.c +++ b/src/lib/evas/canvas/evas_canvas3d_scene.c @@ -74,6 +74,8 @@ _evas_canvas3d_scene_eo_base_constructor(Eo *obj, Evas_Canvas3D_Scene_Data *pd) pd->color_pick_enabled = EINA_FALSE; pd->node_mesh_colors = NULL; pd->colors_node_mesh = NULL; + pd->depth_offset = 4.0; + pd->depth_constant = 100.0; return obj; } @@ -804,4 +806,21 @@ _evas_canvas3d_scene_color_pick_enable_set(Eo *obj EINA_UNUSED, Evas_Canvas3D_Sc return EINA_TRUE; } +EOLIAN static void +_evas_canvas3d_scene_shadows_depth_set(Eo *obj EINA_UNUSED, Evas_Canvas3D_Scene_Data *pd, + Evas_Real depth_offset, Evas_Real depth_constant) +{ + pd->depth_offset = depth_offset; + pd->depth_constant = depth_constant; + eo_do(obj, evas_canvas3d_object_change(EVAS_CANVAS3D_STATE_SCENE_SHADOWS_DEPTH, NULL)); +} + +EOLIAN static void +_evas_canvas3d_scene_shadows_depth_get(Eo *obj EINA_UNUSED, Evas_Canvas3D_Scene_Data *pd, + Evas_Real *depth_offset, Evas_Real *depth_constant) +{ + if (depth_offset) *depth_offset = pd->depth_offset; + if (depth_constant) *depth_constant = pd->depth_constant; +} + #include "canvas/evas_canvas3d_scene.eo.c" diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.eo b/src/lib/evas/canvas/evas_canvas3d_scene.eo index a9e7aa0..0464809 100644 --- a/src/lib/evas/canvas/evas_canvas3d_scene.eo +++ b/src/lib/evas/canvas/evas_canvas3d_scene.eo @@ -145,6 +145,21 @@ class Evas.Canvas3D.Scene (Evas.Canvas3D.Object, Evas.Common_Interface) camera node for the scene.]] } } + @property shadows_depth { + set { + [[Set scale and units used to calculate depth values.]] + } + get { + [[Get scale and units used to calculate depth values.]] + } + values { + depth_offset: Evas.Real; [[Scale factor that is used to + create a variable depth offset + for each polygon.]] + depth_constant: Evas.Real; [[Value to create a constant + depth offset]] + } + } } implements { Eo.Base.constructor; diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 21c94f2..f82d825 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -2694,6 +2694,8 @@ _3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, scene_data.bg_color = pd_scene->bg_color; scene_data.shadows_enabled = pd_scene->shadows_enabled; scene_data.camera_node = pd_scene->camera_node; + scene_data.depth_offset = pd_scene->depth_offset; + scene_data.depth_constant = pd_scene->depth_constant; /* Phase 1 - Update scene graph tree. */ eo_do(scene, evas_canvas3d_object_update()); diff --git a/src/lib/evas/canvas/evas_types.eot b/src/lib/evas/canvas/evas_types.eot index 6a6b98e..eb4b042 100644 --- a/src/lib/evas/canvas/evas_types.eot +++ b/src/lib/evas/canvas/evas_types.eot @@ -264,6 +264,7 @@ enum Evas.Canvas3D.State scene_size, scene_shadows_enabled, scene_updated, [[@since 1.14]] + scene_shadows_depth, texture_data = 1, texture_wrap, @@ -285,6 +286,8 @@ enum Evas.Canvas3D.State mesh_blending, mesh_alpha_test, mesh_color_pick, + mesh_shadows_edges_filtering, + mesh_shadows_constant_bias, camera_projection = 1, diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index e5d5889..c15a579 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -229,6 +229,9 @@ struct _Evas_Canvas3D_Scene Eina_Hash *node_mesh_colors; Eina_Hash *colors_node_mesh; + /*sets constant for shadow rendering*/ + Evas_Real depth_offset; + Evas_Real depth_constant; }; struct _Evas_Canvas3D_Node_Mesh @@ -387,6 +390,10 @@ struct _Evas_Canvas3D_Mesh Evas_Color color_pick_key; #endif Eina_Bool color_pick_enabled :1; + /*sets of the quality and offsets for shadow rendering*/ + int shadows_edges_filtering_level; + Evas_Real shadows_edges_size; + Evas_Real shadows_constant_bias; }; struct _Evas_Canvas3D_Texture @@ -440,6 +447,10 @@ struct _Evas_Canvas3D_Scene_Public_Data Eina_Hash *node_mesh_colors; Eina_Hash *colors_node_mesh; + + /*sets constant for shadow rendering*/ + Evas_Real depth_offset; + Evas_Real depth_constant; }; struct _Evas_Canvas3D_Pick_Data diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d.c b/src/modules/evas/engines/gl_common/evas_gl_3d.c index 6264f80..69c9c54 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c @@ -1005,7 +1005,14 @@ _mesh_draw_data_build(E3D_Draw_Data *data, data->flags |= E3D_SHADER_FLAG_ALPHA_TEST_ENABLED; if (pdmesh->shadowed) - data->flags |= E3D_SHADER_FLAG_SHADOWED; + { + data->flags |= E3D_SHADER_FLAG_SHADOWED; + data->pcf_size = 1 / pdmesh->shadows_edges_size; + data->pcf_step = (Evas_Real)pdmesh->shadows_edges_filtering_level; +#ifdef GL_GLES + data->constant_bias = pdmesh->shadows_constant_bias; +#endif + } if (pdmesh->color_pick_enabled) data->color_pick_key = pdmesh->color_pick_key; @@ -1178,7 +1185,7 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_Mat4 matrix_vp; glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonOffset(4.0, 100.0); + glPolygonOffset(data->depth_offset, data->depth_constant); #ifdef GL_GLES glBindFramebuffer(GL_FRAMEBUFFER, drawable->shadow_fbo); glBindRenderbuffer(GL_RENDERBUFFER, drawable->depth_render_buf); diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h index 4ac9cac..6f44456 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h @@ -111,6 +111,12 @@ struct _E3D_Draw_Data #else Evas_Color color_pick_key; #endif + /*Sets of the quality of shadow rendering*/ + Evas_Real pcf_step; + Evas_Real pcf_size; +#ifdef GL_GLES + Evas_Real constant_bias; +#endif }; struct _E3D_Texture diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c index 0046508..21d5d18 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_shader.c @@ -45,6 +45,11 @@ typedef enum _E3D_Uniform E3D_UNIFORM_TEXTURE_MATRIX_TRANSFORM_NORMAL1, E3D_UNIFORM_SHADOWMAP, + E3D_UNIFORM_SHADOWS_PCF_STEP, + E3D_UNIFORM_SHADOWS_PCF_SIZE, +#ifdef GL_GLES + E3D_UNIFORM_SHADOWS_CONSTANT_BIAS, +#endif E3D_UNIFORM_LIGHT_POSITION, E3D_UNIFORM_LIGHT_SPOT_DIR, @@ -337,6 +342,11 @@ static const char *uniform_names[] = "uTextureMatrixTransformEmission1", "uTextureMatrixTransformNormal1", "uShadowMap", + "uShadowsPCFStep", + "uShadowsPCFSize", +#ifdef GL_GLES + "uShadowsConstantBias", +#endif "uLightPosition", "uLightSpotDir", "uLightSpotExp", @@ -512,6 +522,17 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data) case E3D_UNIFORM_SHADOWMAP: glUniform1i(loc, data->smap_sampler); break; + case E3D_UNIFORM_SHADOWS_PCF_STEP: + glUniform1f(loc, data->pcf_step); + break; + case E3D_UNIFORM_SHADOWS_PCF_SIZE: + glUniform1f(loc, data->pcf_size); + break; +#ifdef GL_GLES + case E3D_UNIFORM_SHADOWS_CONSTANT_BIAS: + glUniform1f(loc, data->constant_bias); + break; +#endif case E3D_UNIFORM_LIGHT_POSITION: glUniform4f(loc, data->light.position.x, data->light.position.y, data->light.position.z, data->light.position.w); diff --git a/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x b/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x index 1a282f6..0284011 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x +++ b/src/modules/evas/engines/gl_common/shader_3d/evas_gl_3d_shaders.x @@ -3,7 +3,7 @@ static const char vertex_color_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -46,7 +46,7 @@ static const char vertex_color_vert_glsl[] = static const char vertex_color_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -116,7 +116,7 @@ static const char vertex_color_frag_glsl[] = static const char diffuse_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -160,7 +160,7 @@ static const char diffuse_vert_glsl[] = static const char diffuse_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -261,7 +261,7 @@ static const char diffuse_frag_glsl[] = static const char flat_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -386,7 +386,7 @@ static const char flat_vert_glsl[] = static const char flat_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -401,27 +401,31 @@ static const char flat_frag_glsl[] = "#ifdef SHADOWED\n" "varying vec4 vLightPosition;\n" "uniform sampler2D uShadowMap;\n" + "uniform float uShadowsPCFStep;\n" + "uniform float uShadowsPCFSize;\n" + "uniform float uShadowsConstantBias;\n" "float shadow;\n" - "float pcf(vec4 lpos, float size)\n" + "float pcf(vec4 lpos)\n" "{\n" " vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n" - " float i, j, shadow;\n" + " float i, j, shadow, q, c;\n" + " q = floor(uShadowsPCFStep * 2.0);\n" + " c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n" " shadow = 0.0;\n" "#ifndef GL_ES\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" - " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize).x);\n" "#else\n" " const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n" - " const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" " {\n" - " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size);\n" - " shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n" + " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize);\n" + " shadow += float(smcoord.z < dot(zvalue, unpack) + uShadowsConstantBias);\n" " }\n" "#endif //GL_ES\n" - " return shadow / 64.0;\n" + " return shadow / c;\n" "}\n" "#endif //SHADOWED\n" "#ifdef DIFFUSE\n" @@ -570,7 +574,7 @@ static const char flat_frag_glsl[] = "void main() {\n" " vec4 color;\n" "#ifdef SHADOWED\n" - " shadow = pcf(vLightPosition, 1.0 / 200.0);\n" + " shadow = pcf(vLightPosition);\n" "#endif //SHADOWED\n" " color = fragmentFlat();\n" "#ifdef ALPHA_TEST_ENABLED\n" @@ -628,7 +632,7 @@ static const char flat_frag_glsl[] = static const char phong_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -721,7 +725,7 @@ static const char phong_vert_glsl[] = static const char phong_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -738,27 +742,31 @@ static const char phong_frag_glsl[] = "#ifdef SHADOWED\n" "varying vec4 vLightPosition;\n" "uniform sampler2D uShadowMap;\n" + "uniform float uShadowsPCFStep;\n" + "uniform float uShadowsPCFSize;\n" + "uniform float uShadowsConstantBias;\n" "float shadow;\n" - "float pcf(vec4 lpos, float size)\n" + "float pcf(vec4 lpos)\n" "{\n" " vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n" - " float i, j, shadow;\n" + " float i, j, shadow, q, c;\n" + " q = floor(uShadowsPCFStep * 2.0);\n" + " c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n" " shadow = 0.0;\n" "#ifndef GL_ES\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" - " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize).x);\n" "#else\n" " const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n" - " const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" " {\n" - " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size);\n" - " shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n" + " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize);\n" + " shadow += float(smcoord.z < dot(zvalue, unpack) + uShadowsConstantBias);\n" " }\n" "#endif //GL_ES\n" - " return shadow / 64.0;\n" + " return shadow / c;\n" "}\n" "#endif //SHADOWED\n" "#ifdef DIFFUSE\n" @@ -943,7 +951,7 @@ static const char phong_frag_glsl[] = "{\n" " vec4 color;\n" "#ifdef SHADOWED\n" - " shadow = pcf(vLightPosition, 1.0 / 300.0);\n" + " shadow = pcf(vLightPosition);\n" "#endif //SHADOWED\n" " color = fragmentPhong();\n" "#ifdef ALPHA_TEST_ENABLED\n" @@ -1001,7 +1009,7 @@ static const char phong_frag_glsl[] = static const char normal_map_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1151,7 +1159,7 @@ static const char normal_map_vert_glsl[] = static const char normal_map_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1168,27 +1176,31 @@ static const char normal_map_frag_glsl[] = "#ifdef SHADOWED\n" "varying vec4 vLightPosition;\n" "uniform sampler2D uShadowMap;\n" + "uniform float uShadowsPCFStep;\n" + "uniform float uShadowsPCFSize;\n" + "uniform float uShadowsConstantBias;\n" "float shadow;\n" - "float pcf(vec4 lpos, float size)\n" + "float pcf(vec4 lpos)\n" "{\n" " vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n" - " float i, j, shadow;\n" + " float i, j, shadow, q, c;\n" + " q = floor(uShadowsPCFStep * 2.0);\n" + " c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n" " shadow = 0.0;\n" "#ifndef GL_ES\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" - " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize).x);\n" "#else\n" " const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n" - " const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" " {\n" - " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size);\n" - " shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n" + " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize);\n" + " shadow += float(smcoord.z < dot(zvalue, unpack) + uShadowsConstantBias);\n" " }\n" "#endif //GL_ES\n" - " return shadow / 64.0;\n" + " return shadow / c;\n" "}\n" "#endif //SHADOWED\n" "#ifdef NORMAL_TEXTURE\n" @@ -1417,7 +1429,7 @@ static const char normal_map_frag_glsl[] = "void main() {\n" " vec4 color;\n" "#ifdef SHADOWED\n" - " shadow = pcf(vLightPosition, 1.0 / 200.0);\n" + " shadow = pcf(vLightPosition);\n" "#endif //SHADOWED\n" " color = fragmentNormalMap();\n" "#ifdef ALPHA_TEST_ENABLED\n" @@ -1474,7 +1486,7 @@ static const char normal_map_frag_glsl[] = static const char shadow_map_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1510,7 +1522,7 @@ static const char shadow_map_vert_glsl[] = "#endif // VERTEX_POSITION\n" "#endif //VERTEX_POSITION_BLEND\n" "#ifdef ALPHA_TEST_ENABLED\n" - " #ifdef VERTEX_TEXCOORD_BLEND\n" + "#ifdef VERTEX_TEXCOORD_BLEND\n" " vTexCoord = mix(aTexCoord1.st, aTexCoord0.st, uTexCoordWeight);\n" "#else\n" "#ifdef VERTEX_TEXCOORD\n" @@ -1524,7 +1536,7 @@ static const char shadow_map_vert_glsl[] = static const char shadow_map_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1627,7 +1639,7 @@ static const char shadow_map_frag_glsl[] = static const char color_pick_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1654,7 +1666,7 @@ static const char color_pick_vert_glsl[] = static const char color_pick_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1723,7 +1735,7 @@ static const char color_pick_frag_glsl[] = static const char parallax_occlusion_vert_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1843,7 +1855,7 @@ static const char parallax_occlusion_vert_glsl[] = static const char parallax_occlusion_frag_glsl[] = "#ifdef GL_ES\n" - "precision mediump float;\n" + "precision highp float;\n" "precision mediump int;\n" "precision lowp sampler2D;\n" "#endif\n" @@ -1871,27 +1883,31 @@ static const char parallax_occlusion_frag_glsl[] = "#ifdef SHADOWED\n" "varying vec4 vLightPosition;\n" "uniform sampler2D uShadowMap;\n" + "uniform float uShadowsPCFStep;\n" + "uniform float uShadowsPCFSize;\n" + "uniform float uShadowsConstantBias;\n" "float shadow;\n" - "float pcf(vec4 lpos, float size)\n" + "float pcf(vec4 lpos)\n" "{\n" " vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5;\n" - " float i, j, shadow;\n" + " float i, j, shadow, q, c;\n" + " q = floor(uShadowsPCFStep * 2.0);\n" + " c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0);\n" " shadow = 0.0;\n" "#ifndef GL_ES\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" - " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x);\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" + " shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize).x);\n" "#else\n" " const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n" - " const float bias = 0.00015 /*TODO Optimizate set of offset*/;\n" - " for (i = -4.0; i < 4.0; i++)\n" - " for (j = -4.0; j < 4.0; j++)\n" + " for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0)\n" + " for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0)\n" " {\n" - " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size);\n" - " shadow += float(smcoord.z < dot(zvalue, unpack) + bias);\n" + " vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize);\n" + " shadow += float(smcoord.z < dot(zvalue, unpack) + uShadowsConstantBias);\n" " }\n" "#endif //GL_ES\n" - " return shadow / 64.0;\n" + " return shadow / c;\n" "}\n" "#endif //SHADOWED\n" "#ifdef DIFFUSE\n" @@ -2119,7 +2135,7 @@ static const char parallax_occlusion_frag_glsl[] = "void main() {\n" " vec4 color;\n" "#ifdef SHADOWED\n" - " shadow = pcf(vLightPosition, 1.0 / 200.0);\n" + " shadow = pcf(vLightPosition);\n" "#endif //SHADOWED\n" " color = fragmentParallaxMap();\n" "#ifdef ALPHA_TEST_ENABLED\n" diff --git a/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd b/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd index 7814f9a..863bac1 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/flat_frag.shd @@ -49,7 +49,7 @@ vec4 fragmentFlat() void main() { vec4 color; #ifdef SHADOWED - shadow = pcf(vLightPosition, 1.0 / 200.0); + shadow = pcf(vLightPosition); #endif //SHADOWED color = fragmentFlat(); diff --git a/src/modules/evas/engines/gl_common/shader_3d/include.shd b/src/modules/evas/engines/gl_common/shader_3d/include.shd index 3b92e82..fd6be4d 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/include.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/include.shd @@ -40,27 +40,33 @@ define(`FRAGMENT_SHADER_USE_SHADOWS', ` #ifdef SHADOWED varying vec4 vLightPosition; uniform sampler2D uShadowMap; +uniform float uShadowsPCFStep; +uniform float uShadowsPCFSize; +#ifdef GL_ES +uniform float uShadowsConstantBias; +#endif //GL_ES' float shadow; -float pcf(vec4 lpos, float size) +float pcf(vec4 lpos) { vec3 smcoord = lpos.xyz / lpos.w * 0.5 + 0.5; - float i, j, shadow; + float i, j, shadow, q, c; + q = floor(uShadowsPCFStep * 2.0); + c = floor(uShadowsPCFStep * uShadowsPCFStep * 4.0); shadow = 0.0; `#ifndef GL_ES' - for (i = -4.0; i < 4.0; i++) - for (j = -4.0; j < 4.0; j++) - shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size).x); + for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0) + for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0) + shadow += float(smcoord.z <= texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize).x); `#else' const vec4 unpack = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0); - const float bias = 0.00015 /*TODO Optimizate set of offset*/; - for (i = -4.0; i < 4.0; i++) - for (j = -4.0; j < 4.0; j++) + for (i = -uShadowsPCFStep; i < uShadowsPCFStep; i += 1.0) + for (j = -uShadowsPCFStep; j < uShadowsPCFStep; j += 1.0) { - vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / 8.0, j / 8.0) * size); - shadow += float(smcoord.z < dot(zvalue, unpack) + bias); + vec4 zvalue = texture2D(uShadowMap, smcoord.xy + vec2(i / q, j / q) * uShadowsPCFSize); + shadow += float(smcoord.z < dot(zvalue, unpack) + uShadowsConstantBias); } `#endif //GL_ES' - return shadow / 64.0; + return shadow / c; } #endif //SHADOWED') diff --git a/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd b/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd index 06d4948..403fefd 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/normal_map_frag.shd @@ -128,7 +128,7 @@ vec4 fragmentNormalMap() void main() { vec4 color; #ifdef SHADOWED - shadow = pcf(vLightPosition, 1.0 / 200.0); + shadow = pcf(vLightPosition); #endif //SHADOWED color = fragmentNormalMap(); diff --git a/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd b/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd index be550ac..bd53418 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd @@ -216,7 +216,7 @@ vec4 fragmentParallaxMap() void main() { vec4 color; #ifdef SHADOWED - shadow = pcf(vLightPosition, 1.0 / 200.0); + shadow = pcf(vLightPosition); #endif //SHADOWED color = fragmentParallaxMap(); diff --git a/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd b/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd index ef914e9..78a867b 100644 --- a/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd +++ b/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd @@ -87,7 +87,7 @@ void main() { vec4 color; #ifdef SHADOWED - shadow = pcf(vLightPosition, 1.0 / 300.0); + shadow = pcf(vLightPosition); #endif //SHADOWED color = fragmentPhong(); --