Hi. Honestly, I just realized current ShadeMode.
Generally, Shade is correlated with shadowing. I couldn't imagine shade mode is related with color_pick and anti-aliaising. If this Shade Mode is about Shader, then I really like to rename it Shader Filter or Shader Mode. It's much clear. Currently, I accept this patch in point of a feature expanding. Thank you. -----Original Message----- From: "Oleksandr Shcherbina"<o.shcherb...@samsung.com> To: <g...@lists.enlightenment.org>; Cc: Sent: 2016-04-12 (화) 01:01:19 Subject: [EGIT] [core/efl] master 01/01: evas.canvas3d: Add FXAA post processing render. hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=1f66a9e7315f7b5744e73fe5456b7633fc9104a2 commit 1f66a9e7315f7b5744e73fe5456b7633fc9104a2 Author: Oleksandr Shcherbina <o.shcherb...@samsung.com> Date: Tue Apr 12 00:50:46 2016 +0900 evas.canvas3d: Add FXAA post processing render. Summary: Add post processing render function as rendering full screen quard after rendering to texture. Add possibility use size of current frame in shader. Add FXAA shader source files Reviewers: raster, cedric, Hermet Subscribers: jpeg Differential Revision: https://phab.enlightenment.org/D3847 --- src/Makefile_Evas.am 2 + src/lib/evas/canvas/efl_canvas_scene3d.c 11 ++- src/lib/evas/canvas/evas_canvas3d_scene.c 4 +- src/lib/evas/canvas/evas_canvas3d_scene.eo 2 +- src/lib/evas/canvas/evas_types.eot 18 +++-- src/lib/evas/include/evas_private.h 3 + src/modules/evas/engines/gl_common/evas_gl_3d.c 81 ++++++++++++++----- .../evas/engines/gl_common/evas_gl_3d_private.h 5 ++ .../evas/engines/gl_common/evas_gl_3d_renderer.c 12 +++ .../evas/engines/gl_common/evas_gl_3d_shader.c 11 ++- .../gl_common/shader_3d/evas_gl_3d_shaders.x 90 ++++++++++++++++++++++ .../shader_3d/post_processing_fxaa_frag.shd 63 +++++++++++++++ .../shader_3d/post_processing_fxaa_vert.shd 12 +++ 13 files changed, 282 insertions(+), 32 deletions(-) diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index d2e15de..bd37687 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -785,6 +785,8 @@ modules/evas/engines/gl_common/shader_3d/color_pick_vert.shd \ modules/evas/engines/gl_common/shader_3d/color_pick_frag.shd \ modules/evas/engines/gl_common/shader_3d/parallax_occlusion_vert.shd \ modules/evas/engines/gl_common/shader_3d/parallax_occlusion_frag.shd \ +modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_vert.shd \ +modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_frag.shd \ $(NULL) EXTRA_DIST += \ diff --git a/src/lib/evas/canvas/efl_canvas_scene3d.c b/src/lib/evas/canvas/efl_canvas_scene3d.c index 0a86c47..81d6375 100644 --- a/src/lib/evas/canvas/efl_canvas_scene3d.c +++ b/src/lib/evas/canvas/efl_canvas_scene3d.c @@ -29,7 +29,7 @@ _efl_canvas_scene3d_scene3d_get(Eo *eo_obj, void *pd EINA_UNUSED) } void -_evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, +_evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o EINA_UNUSED, Evas_Canvas3D_Scene *scene) { @@ -107,7 +107,14 @@ _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj EINA_UNUSED, scene_data.camera_node = pd_scene->camera_node; scene_data.depth_offset = pd_scene->depth_offset; scene_data.depth_constant = pd_scene->depth_constant; - + if (evas_object_anti_alias_get(eo_obj)) + { + /*Use post processing render*/ + scene_data.post_processing = EINA_TRUE; + scene_data.color_pick_enabled = EINA_FALSE; + scene_data.render_to_texture = EINA_TRUE; + scene_data.post_processing_type = EVAS_CANVAS3D_SHADE_MODE_POST_PROCESSING_FXAA; + } /* Phase 1 - Update scene graph tree. */ evas_canvas3d_object_update(scene); diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.c b/src/lib/evas/canvas/evas_canvas3d_scene.c index a8cc117..8a7d08e 100644 --- a/src/lib/evas/canvas/evas_canvas3d_scene.c +++ b/src/lib/evas/canvas/evas_canvas3d_scene.c @@ -13,6 +13,8 @@ evas_canvas3d_scene_data_init(Evas_Canvas3D_Scene_Public_Data *data) data->colors_node_mesh = NULL; data->render_to_texture = EINA_FALSE; data->lod_distance = 0; + data->post_processing = EINA_FALSE; + data->post_processing_type = EVAS_CANVAS3D_SHADE_MODE_POST_PROCESSING_FXAA; } void @@ -78,7 +80,6 @@ _evas_canvas3d_scene_eo_base_constructor(Eo *obj, Evas_Canvas3D_Scene_Data *pd) pd->colors_node_mesh = NULL; pd->depth_offset = 4.0; pd->depth_constant = 100.0; - return obj; } @@ -635,6 +636,7 @@ _evas_canvas3d_scene_pick(const Eo *obj, Evas_Canvas3D_Scene_Data *pd, Evas_Real scene_data.camera_node = pd->camera_node; scene_data.color_pick_enabled = pd->color_pick_enabled; update_scene = evas_canvas3d_object_dirty_get(obj, EVAS_CANVAS3D_STATE_SCENE_UPDATED); + scene_data.post_processing = EINA_FALSE; if (update_scene) { if (pd->node_mesh_colors) diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.eo b/src/lib/evas/canvas/evas_canvas3d_scene.eo index 0464809..283c3d4 100644 --- a/src/lib/evas/canvas/evas_canvas3d_scene.eo +++ b/src/lib/evas/canvas/evas_canvas3d_scene.eo @@ -160,7 +160,7 @@ class Evas.Canvas3D.Scene (Evas.Canvas3D.Object, Evas.Common_Interface) depth offset]] } } - } +} implements { Eo.Base.constructor; Evas.Canvas3D.Object.update_notify; diff --git a/src/lib/evas/canvas/evas_types.eot b/src/lib/evas/canvas/evas_types.eot index 27a2830..7d1a24e 100644 --- a/src/lib/evas/canvas/evas_types.eot +++ b/src/lib/evas/canvas/evas_types.eot @@ -297,6 +297,7 @@ enum Evas.Canvas3D.State scene_shadows_enabled, scene_updated, [[@since 1.14]] scene_shadows_depth, + scene_render_to_texture, texture_data = 1, texture_wrap, @@ -487,14 +488,15 @@ enum Evas.Canvas3D.Shade_Mode [[Shader shade modes @since 1.10]] - vertex_color = 0, [[Shaded using vertex color attribute]] - diffuse, [[Shaded using material diffuse term]] - flat, [[Per-vertex flat lighting]] - phong, [[Per-pixel phong shading]] - normal_map, [[Per-pixel normal map shading]] - shadow_map_render, [[Fragment color is defined by its z-coord]] - color_pick, [[Rendering to additional frame bufer]] - parallax_occlusion [[Per-pixel parallax occlusion map shading]] + vertex_color = 0, [[Shaded using vertex color attribute]] + diffuse, [[Shaded using material diffuse term]] + flat, [[Per-vertex flat lighting]] + phong, [[Per-pixel phong shading]] + normal_map, [[Per-pixel normal map shading]] + shadow_map_render, [[Fragment color is defined by its z-coord]] + color_pick, [[Rendering to additional frame bufer]] + parallax_occlusion, [[Per-pixel parallax occlusion map shading]] + post_processing_FXAA [[Render full screen quard]] } enum Evas.Canvas3D.Vertex_Attrib diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 4a8b37a..2b2c174 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -458,6 +458,9 @@ struct _Evas_Canvas3D_Scene_Public_Data Eina_Bool render_to_texture; unsigned int lod_distance; + + Eina_Bool post_processing :1; + Evas_Canvas3D_Shade_Mode post_processing_type; }; 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 6f0e1ec..f4f7b00 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c @@ -1167,7 +1167,6 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, drawable->texDepth, 0); - e3d_renderer_target_set(renderer, drawable); e3d_renderer_clear(renderer, &c); Evas_Canvas3D_Node_Data *pd_light_node = eo_data_scope_get(light, EVAS_CANVAS3D_NODE_CLASS); @@ -1199,19 +1198,20 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, } } - glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_POLYGON_OFFSET_FILL); - if (data->render_to_texture) - { - data->render_to_texture = EINA_FALSE; - e3d_renderer_color_pick_target_set(renderer, drawable); - } - else - { - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - drawable->tex, 0); - e3d_renderer_clear(renderer, &data->bg_color); - } + if (data->render_to_texture) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + drawable->texcolorpick, 0); + e3d_renderer_clear(renderer, &data->bg_color); + } + else + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + drawable->tex, 0); + e3d_renderer_clear(renderer, &data->bg_color); + } } void @@ -1301,8 +1301,49 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_C e3d_renderer_target_set(renderer, drawable); e3d_renderer_clear(renderer, &data->bg_color); - /*Render scene data*/ - _scene_render(drawable, renderer, data); + if (data->post_processing) + e3d_drawable_scene_render_to_texture(drawable, renderer, data);//Render to additional texture + else + _scene_render(drawable, renderer, data);//Common main render +} + +void +_scene_post_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_Canvas3D_Scene_Public_Data *data) +{ + E3D_Draw_Data drawable_data; + float vertices_of_square[] = {-1.0, 1.0, 0.0, 1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, 1.0, -1.0, 0.0}; + unsigned short indices_of_square[] = {0, 1, 2, 2, 1, 3}; + + memset(&drawable_data, 0x00, sizeof(E3D_Draw_Data)); + + drawable_data.flags = E3D_SHADER_FLAG_VERTEX_POSITION; + drawable_data.mode = data->post_processing_type; + drawable_data.assembly = EVAS_CANVAS3D_VERTEX_ASSEMBLY_TRIANGLES; + drawable_data.indices = indices_of_square; + drawable_data.vertex_count = 4; + drawable_data.index_count = 6; + drawable_data.index_format = EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_SHORT; + eina_matrix4_identity(&drawable_data.matrix_mv); + eina_matrix4_identity(&drawable_data.matrix_mvp); + drawable_data.frame_size_h = (Evas_Real)drawable->h; + drawable_data.frame_size_w = (Evas_Real)drawable->w; + /*Initialize Evas_Canvas3D_Vertex_Buffer for full screen quard*/ + drawable_data.vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].vertex0.data = (void *)vertices_of_square; + drawable_data.vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].vertex0.element_count = 3; + drawable_data.vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].vertex0.stride = 3 * sizeof(float); + drawable_data.vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].vertex0.owns_data = EINA_FALSE; + drawable_data.vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].vertex0.size = 0; + + e3d_renderer_clear(renderer, &data->bg_color); + + /*Initialize texture units*/ + drawable_data.smap_sampler = e3d_renderer_sampler_shadowmap_get(renderer); + drawable_data.colortex_sampler = e3d_renderer_sampler_colortexture_get(renderer); + + /*Render full screen quard with color pick texture unit*/ + e3d_renderer_draw(renderer, &drawable_data); + e3d_renderer_flush(renderer); } Eina_Bool @@ -1315,10 +1356,10 @@ e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *rende Eina_Iterator *itmn; void *ptrmn; Eina_List *repeat_node = NULL; - Evas_Color c = {0.0, 0.0, 0.0, 0.0}, *unic_color = NULL; + Evas_Color *unic_color = NULL; e3d_renderer_color_pick_target_set(renderer, drawable); - e3d_renderer_clear(renderer, &c); + e3d_renderer_clear(renderer, &data->bg_color); if (data->color_pick_enabled) //Use rendering to texture in color pick mechanism { @@ -1374,10 +1415,12 @@ e3d_drawable_scene_render_to_texture(E3D_Drawable *drawable, E3D_Renderer *rende else { _scene_render(drawable, renderer, data); //Just render scene in texture + glBindFramebuffer(GL_FRAMEBUFFER, drawable->fbo); + /*Render full screen quard*/ + if (data->post_processing) + _scene_post_render(drawable, renderer, data); } - glBindFramebuffer(GL_FRAMEBUFFER, drawable->fbo); - return EINA_TRUE; } 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 da508d2..cbdb0f7 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 @@ -114,6 +114,9 @@ struct _E3D_Draw_Data Evas_Real constant_bias; Eina_Bool render_to_texture; + + Evas_Real frame_size_h; + Evas_Real frame_size_w; }; struct _E3D_Texture @@ -175,4 +178,6 @@ void e3d_renderer_draw(E3D_Renderer *renderer, E3D_Draw_Data *da void e3d_renderer_flush(E3D_Renderer *renderer); void e3d_renderer_color_pick_target_set(E3D_Renderer *renderer, E3D_Drawable *drawable); Eina_Bool e3d_renderer_rendering_to_texture_get(E3D_Renderer *renderer); +GLint e3d_renderer_sampler_colortexture_get(E3D_Renderer *renderer); +GLint e3d_renderer_sampler_shadowmap_get(E3D_Renderer *renderer); #endif /* EVAS_GL_3D_PRIVATE_H */ diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c b/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c index 05e6e97..0fc0f89 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c @@ -414,3 +414,15 @@ e3d_renderer_flush(E3D_Renderer *renderer EINA_UNUSED) { glFlush(); } + +GLint +e3d_renderer_sampler_colortexture_get(E3D_Renderer *renderer) +{ + return renderer->colortex_sampler; +} + +GLint +e3d_renderer_sampler_shadowmap_get(E3D_Renderer *renderer) +{ + return renderer->smap_sampler; +} 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 9fca4a1..5f5c0a6 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 @@ -69,7 +69,8 @@ typedef enum _E3D_Uniform E3D_UNIFORM_ALPHATEST_COMPARISON, E3D_UNIFORM_ALPHATEST_REFVALUE, E3D_UNIFORM_RENDER_TO_TEXTURE, - + E3D_UNIFORM_FRAME_SIZE_H, + E3D_UNIFORM_FRAME_SIZE_W, E3D_UNIFORM_COUNT, } E3D_Uniform; @@ -363,6 +364,8 @@ static const char *uniform_names[] = "uAlphaTestComparison", "uAlphaTestRefValue", "uColorTexture", + "uFrameSizeH", + "uFrameSizeW" }; static inline void @@ -635,6 +638,12 @@ _uniform_upload(E3D_Uniform u, GLint loc, const E3D_Draw_Data *data) case E3D_UNIFORM_RENDER_TO_TEXTURE: glUniform1i(loc, data->colortex_sampler); break; + case E3D_UNIFORM_FRAME_SIZE_H: + glUniform1f(loc, data->frame_size_h); + break; + case E3D_UNIFORM_FRAME_SIZE_W: + glUniform1f(loc, data->frame_size_w); + break; default: ERR("Invalid uniform ID."); break; 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 c03d8b5..90aafab 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 @@ -2112,6 +2112,94 @@ static const char parallax_occlusion_frag_glsl[] = "#endif //FOG_ENABLED\n" "}\n"; +static const char post_processing_fxaa_vert_glsl[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "precision mediump int;\n" + "precision lowp sampler2D;\n" + "#endif\n" + "uniform mat4 uMatrixMvp;\n" + "#ifdef VERTEX_POSITION\n" + "attribute vec4 aPosition0;\n" + "#endif //VERTEX_POSITION\n" + "#ifdef VERTEX_POSITION_BLEND\n" + "attribute vec4 aPosition1;\n" + "uniform float uPositionWeight;\n" + "#endif //VERTEX_POSITION_BLEND\n" + "varying vec2 tc0;\n" + "void main()\n" + "{\n" + " #ifdef VERTEX_POSITION_BLEND\n" + " vec4 position = mix(aPosition1, aPosition0, uPositionWeight);\n" + " position = vec4(position.xyz, 1.0);\n" + "#else\n" + "#ifdef VERTEX_POSITION\n" + " vec4 position = vec4(aPosition0.xyz, 1.0);\n" + "#endif // VERTEX_POSITION\n" + "#endif //VERTEX_POSITION_BLEND\n" + " gl_Position = uMatrixMvp * position;\n" + " tc0 = position.xy * 0.5 + 0.5;\n" + "}\n"; + +static const char post_processing_fxaa_frag_glsl[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "precision mediump int;\n" + "precision lowp sampler2D;\n" + "#endif\n" + "//FXAA fragment shader by Timothy Lottes\n" + "//http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf\n" + "//modified and adapted to www.enlightenment.org by Oleksander Shcherbina\n" + "uniform sampler2D uColorTexture;\n" + "uniform float uFrameSizeH;\n" + "uniform float uFrameSizeW;\n" + "varying vec2 tc0;\n" + "vec4 fxaa()\n" + "{\n" + " float _SPAN_MAX_ = 8.0;\n" + " float _REDUCE_MUL_ = (1.0/8.0);\n" + " float _REDUCE_MIN_ = (1.0/128.0);\n" + " vec4 l = vec4(0.299, 0.587, 0.114, 0.0);\n" + " vec2 frameBufSize = vec2(uFrameSizeW, uFrameSizeH);\n" + " vec2 direction;\n" + " vec4 colorNW = texture2D(uColorTexture, tc0 + (vec2(-1.0, -1.0)/frameBufSize));\n" + " vec4 colorNE = texture2D(uColorTexture, tc0 + (vec2(1.0, -1.0)/frameBufSize));\n" + " vec4 colorSW = texture2D(uColorTexture, tc0 + (vec2(-1.0, 1.0)/frameBufSize));\n" + " vec4 colorSE = texture2D(uColorTexture, tc0 + (vec2(1.0, 1.0)/frameBufSize));\n" + " vec4 colorM = texture2D(uColorTexture,tc0);\n" + " float lNW = dot(colorNW, l);\n" + " float lNE = dot(colorNE, l);\n" + " float lSW = dot(colorSW, l);\n" + " float lSE = dot(colorSE, l);\n" + " float lM = dot(colorM, l);\n" + " float lMin = min(lM, min(min(lNW, lNE), min(lSW, lSE)));\n" + " float lMax = max(lM, max(max(lNW, lNE), max(lSW, lSE)));\n" + " direction.x = -((lNW + lNE) - (lSW + lSE));\n" + " direction.y = ((lNW + lSW) - (lNE + lSE));\n" + " float directionReduce = max(\n" + " (lNW + lNE + lSW + lSE) * (0.25 * _REDUCE_MUL_),\n" + " _REDUCE_MIN_);\n" + " float rcpDirMin = 1.0/(min(abs(direction.x), abs(direction.y)) + directionReduce);\n" + " direction = min(vec2(_SPAN_MAX_, _SPAN_MAX_),\n" + " max(vec2(-_SPAN_MAX_, -_SPAN_MAX_),\n" + " direction * rcpDirMin)) / frameBufSize;\n" + " vec4 colorA = 0.5 * (\n" + " texture2D(uColorTexture, tc0.xy + direction * (1.0/3.0 - 0.5)) +\n" + " texture2D(uColorTexture, tc0.xy + direction * (2.0/3.0 - 0.5)));\n" + " vec4 colorB = colorA * 0.5 + 0.25 * (\n" + " texture2D(uColorTexture, tc0.xy + direction * (- 0.5)) +\n" + " texture2D(uColorTexture, tc0.xy + direction * 0.5));\n" + " float lB = dot(colorB, l);\n" + " if((lB < lMin) (lB > lMax))\n" + " return colorA;\n" + " else\n" + " return colorB;\n" + "}\n" + "void main()\n" + "{\n" + " gl_FragColor = fxaa();\n" + "}\n"; + static const char *vertex_shaders[] = { vertex_color_vert_glsl, @@ -2122,6 +2210,7 @@ static const char *vertex_shaders[] = shadow_map_vert_glsl, color_pick_vert_glsl, parallax_occlusion_vert_glsl, + post_processing_fxaa_vert_glsl, }; static const char *fragment_shaders[] = @@ -2134,4 +2223,5 @@ static const char *fragment_shaders[] = shadow_map_frag_glsl, color_pick_frag_glsl, parallax_occlusion_frag_glsl, + post_processing_fxaa_frag_glsl, }; diff --git a/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_frag.shd b/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_frag.shd new file mode 100644 index 0000000..b78a091 --- /dev/null +++ b/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_frag.shd @@ -0,0 +1,63 @@ +//FXAA fragment shader by Timothy Lottes +//http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf +//modified and adapted to www.enlightenment.org by Oleksander Shcherbina +uniform sampler2D uColorTexture; +uniform float uFrameSizeH; +uniform float uFrameSizeW; +varying vec2 tc0; + +vec4 fxaa() +{ + float _SPAN_MAX_ = 8.0; + float _REDUCE_MUL_ = (1.0/8.0); + float _REDUCE_MIN_ = (1.0/128.0); + vec4 l = vec4(0.299, 0.587, 0.114, 0.0); + vec2 frameBufSize = vec2(uFrameSizeW, uFrameSizeH); + vec2 direction; + + vec4 colorNW = texture2D(uColorTexture, tc0 + (vec2(-1.0, -1.0)/frameBufSize)); + vec4 colorNE = texture2D(uColorTexture, tc0 + (vec2(1.0, -1.0)/frameBufSize)); + vec4 colorSW = texture2D(uColorTexture, tc0 + (vec2(-1.0, 1.0)/frameBufSize)); + vec4 colorSE = texture2D(uColorTexture, tc0 + (vec2(1.0, 1.0)/frameBufSize)); + vec4 colorM = texture2D(uColorTexture,tc0); + + float lNW = dot(colorNW, l); + float lNE = dot(colorNE, l); + float lSW = dot(colorSW, l); + float lSE = dot(colorSE, l); + float lM = dot(colorM, l); + + float lMin = min(lM, min(min(lNW, lNE), min(lSW, lSE))); + float lMax = max(lM, max(max(lNW, lNE), max(lSW, lSE))); + + direction.x = -((lNW + lNE) - (lSW + lSE)); + direction.y = ((lNW + lSW) - (lNE + lSE)); + + float directionReduce = max( + (lNW + lNE + lSW + lSE) * (0.25 * _REDUCE_MUL_), + _REDUCE_MIN_); + + float rcpDirMin = 1.0/(min(abs(direction.x), abs(direction.y)) + directionReduce); + + direction = min(vec2(_SPAN_MAX_, _SPAN_MAX_), + max(vec2(-_SPAN_MAX_, -_SPAN_MAX_), + direction * rcpDirMin)) / frameBufSize; + + vec4 colorA = 0.5 * ( + texture2D(uColorTexture, tc0.xy + direction * (1.0/3.0 - 0.5)) + + texture2D(uColorTexture, tc0.xy + direction * (2.0/3.0 - 0.5))); + vec4 colorB = colorA * 0.5 + 0.25 * ( + texture2D(uColorTexture, tc0.xy + direction * (- 0.5)) + + texture2D(uColorTexture, tc0.xy + direction * 0.5)); + float lB = dot(colorB, l); + + if((lB < lMin) (lB > lMax)) + return colorA; + else + return colorB; +} + +void main() +{ + gl_FragColor = fxaa(); +} diff --git a/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_vert.shd b/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_vert.shd new file mode 100644 index 0000000..8464fdc --- /dev/null +++ b/src/modules/evas/engines/gl_common/shader_3d/post_processing_fxaa_vert.shd @@ -0,0 +1,12 @@ +uniform mat4 uMatrixMvp; + +VERTEX_SHADER_USE_POSITION + +varying vec2 tc0; +void main() +{ + VERTEX_SHADER_POSITION + + gl_Position = uMatrixMvp * position; + tc0 = position.xy * 0.5 + 0.5; +} -- ------------------------------------------------------------------------------ Find and fix application performance issues faster with Applications Manager Applications Manager provides deep performance insights into multiple tiers of your business applications. It resolves application problems quickly and reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/ gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532 _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel