From ad9dd064295b4486a36647558cae1e77b7b48f2c Mon Sep 17 00:00:00 2001 From: renderexpert Date: Thu, 6 Feb 2025 10:49:02 +0000 Subject: [PATCH] Rewrite shaders to use OpenGL ES3 syntax Signed-off-by: renderexpert --- data/vulkan_shaders/reflection.json | 2 +- data/vulkan_shaders/shaders_pack.spv | Bin 341244 -> 348916 bytes drape/gl_functions.cpp | 2 +- drape/gl_gpu_program.cpp | 2 +- shaders/GL/area.vsh.glsl | 29 +- shaders/GL/area3d.vsh.glsl | 30 +- shaders/GL/area3d_outline.vsh.glsl | 31 +- shaders/GL/arrow3d.fsh.glsl | 16 +- shaders/GL/arrow3d.vsh.glsl | 15 +- shaders/GL/arrow3d_outline.fsh.glsl | 12 +- shaders/GL/arrow3d_shadow.fsh.glsl | 12 +- shaders/GL/arrow3d_shadow.vsh.glsl | 14 +- shaders/GL/arrow3d_textured.fsh.glsl | 20 +- shaders/GL/arrow3d_textured.vsh.glsl | 20 +- shaders/GL/circle.fsh.glsl | 30 +- shaders/GL/circle.vsh.glsl | 32 +- shaders/GL/circle_point.fsh.glsl | 22 +- shaders/GL/circle_point.vsh.glsl | 25 +- shaders/GL/colored_symbol.fsh.glsl | 29 +- shaders/GL/colored_symbol.vsh.glsl | 34 +- shaders/GL/colored_symbol_billboard.vsh.glsl | 34 +- shaders/GL/dashed_line.fsh.glsl | 29 +- shaders/GL/dashed_line.vsh.glsl | 30 +- shaders/GL/debug_rect.fsh.glsl | 7 +- shaders/GL/debug_rect.vsh.glsl | 2 +- shaders/GL/hatching_area.fsh.glsl | 27 +- shaders/GL/hatching_area.vsh.glsl | 33 +- shaders/GL/imgui.fsh.glsl | 8 +- shaders/GL/imgui.vsh.glsl | 15 +- shaders/GL/line.fsh.glsl | 26 +- shaders/GL/line.vsh.glsl | 34 +- shaders/GL/masked_texturing.fsh.glsl | 23 +- shaders/GL/masked_texturing.vsh.glsl | 26 +- .../GL/masked_texturing_billboard.vsh.glsl | 27 +- shaders/GL/my_position.vsh.glsl | 29 +- shaders/GL/path_symbol.vsh.glsl | 24 +- shaders/GL/position_accuracy3d.vsh.glsl | 26 +- shaders/GL/route.fsh.glsl | 37 ++- shaders/GL/route.vsh.glsl | 35 +- shaders/GL/route_arrow.fsh.glsl | 29 +- shaders/GL/route_arrow.vsh.glsl | 32 +- shaders/GL/route_dash.fsh.glsl | 34 +- shaders/GL/route_marker.fsh.glsl | 33 +- shaders/GL/route_marker.vsh.glsl | 33 +- shaders/GL/ruler.fsh.glsl | 23 ++ shaders/GL/ruler.vsh.glsl | 21 +- shaders/GL/screen_quad.fsh.glsl | 17 + shaders/GL/screen_quad.vsh.glsl | 7 +- shaders/GL/selection_line.fsh.glsl | 26 +- shaders/GL/selection_line.vsh.glsl | 40 ++- shaders/GL/shader_index.txt | 14 +- shaders/GL/smaa_blending_weight.fsh.glsl | 43 +-- shaders/GL/smaa_blending_weight.vsh.glsl | 18 +- shaders/GL/smaa_edges.fsh.glsl | 21 +- shaders/GL/smaa_edges.vsh.glsl | 19 +- shaders/GL/smaa_final.fsh.glsl | 20 +- shaders/GL/smaa_final.vsh.glsl | 14 +- shaders/GL/solid_color.fsh.glsl | 23 +- shaders/GL/text.fsh.glsl | 25 +- shaders/GL/text.vsh.glsl | 35 +- shaders/GL/text_billboard.vsh.glsl | 34 +- shaders/GL/text_outlined.vsh.glsl | 38 ++- shaders/GL/text_outlined_billboard.vsh.glsl | 38 ++- shaders/GL/text_outlined_gui.fsh.glsl | 35 ++ shaders/GL/text_outlined_gui.vsh.glsl | 36 ++- shaders/GL/texturing.fsh.glsl | 19 +- shaders/GL/texturing.vsh.glsl | 22 +- shaders/GL/texturing3d.fsh.glsl | 21 +- shaders/GL/texturing_billboard.vsh.glsl | 23 +- shaders/GL/texturing_gui.fsh.glsl | 23 ++ shaders/GL/texturing_gui.vsh.glsl | 18 +- shaders/GL/texturing_position.fsh.glsl | 25 ++ shaders/GL/traffic.fsh.glsl | 39 ++- shaders/GL/traffic.vsh.glsl | 30 +- shaders/GL/traffic_circle.fsh.glsl | 27 +- shaders/GL/traffic_circle.vsh.glsl | 29 +- shaders/GL/traffic_line.fsh.glsl | 20 +- shaders/GL/traffic_line.vsh.glsl | 21 +- shaders/GL/transit.fsh.glsl | 4 +- shaders/GL/transit.vsh.glsl | 22 +- shaders/GL/transit_circle.fsh.glsl | 12 +- shaders/GL/transit_circle.vsh.glsl | 25 +- shaders/GL/transit_marker.fsh.glsl | 8 +- shaders/GL/transit_marker.vsh.glsl | 24 +- shaders/GL/user_mark.fsh.glsl | 24 +- shaders/GL/user_mark.vsh.glsl | 28 +- shaders/GL/user_mark_billboard.vsh.glsl | 28 +- shaders/Metal/map.metal | 2 +- shaders/Metal/route.metal | 6 +- shaders/Metal/shapes.metal | 3 +- shaders/Metal/traffic.metal | 7 +- shaders/Metal/transit.metal | 1 + shaders/gl_program_params.cpp | 4 +- shaders/gl_shaders_preprocessor.py | 132 ++++++-- shaders/program_params.hpp | 28 +- shaders/vulkan_shaders_preprocessor.py | 299 +++--------------- tools/unix/generate_vulkan_shaders.sh | 2 +- 97 files changed, 1517 insertions(+), 1016 deletions(-) create mode 100644 shaders/GL/ruler.fsh.glsl create mode 100644 shaders/GL/screen_quad.fsh.glsl create mode 100644 shaders/GL/text_outlined_gui.fsh.glsl create mode 100644 shaders/GL/texturing_gui.fsh.glsl create mode 100644 shaders/GL/texturing_position.fsh.glsl diff --git a/data/vulkan_shaders/reflection.json b/data/vulkan_shaders/reflection.json index b428a2a4eb..e2784fb8a2 100644 --- a/data/vulkan_shaders/reflection.json +++ b/data/vulkan_shaders/reflection.json @@ -1 +1 @@ -[{"prg":0,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":0,"vs_size":3772,"fs_off":3772,"fs_size":2552},{"prg":1,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":6324,"vs_size":3412,"fs_off":9736,"fs_size":1508},{"prg":2,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}]},"vs_off":11244,"vs_size":3560,"fs_off":14804,"fs_size":1756},{"prg":3,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":16560,"vs_size":4468,"fs_off":21028,"fs_size":2508},{"prg":4,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":23536,"vs_size":4468,"fs_off":28004,"fs_size":2508},{"prg":5,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":30512,"vs_size":4440,"fs_off":34952,"fs_size":2084},{"prg":6,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":37036,"vs_size":3768,"fs_off":40804,"fs_size":2084},{"prg":7,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":42888,"vs_size":3104,"fs_off":45992,"fs_size":1992},{"prg":8,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":47984,"vs_size":3104,"fs_off":51088,"fs_size":1992},{"prg":9,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":53080,"vs_size":3352,"fs_off":56432,"fs_size":1336},{"prg":10,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":57768,"vs_size":3352,"fs_off":61120,"fs_size":1336},{"prg":11,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":62456,"vs_size":3692,"fs_off":66148,"fs_size":1904},{"prg":12,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":68052,"vs_size":2716,"fs_off":70768,"fs_size":1336},{"prg":13,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":72104,"vs_size":5084,"fs_off":77188,"fs_size":1332},{"prg":14,"info":{"vs_uni":0,"fs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":78520,"vs_size":5436,"fs_off":83956,"fs_size":1800},{"prg":15,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}]},"vs_off":85756,"vs_size":5452,"fs_off":91208,"fs_size":1828},{"prg":16,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":93036,"vs_size":3988,"fs_off":97024,"fs_size":1508},{"prg":17,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":98532,"vs_size":3352,"fs_off":101884,"fs_size":1336},{"prg":18,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":103220,"vs_size":3696,"fs_off":106916,"fs_size":2092},{"prg":19,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":109008,"vs_size":3516,"fs_off":112524,"fs_size":1716},{"prg":20,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":114240,"vs_size":1820,"fs_off":116060,"fs_size":1416},{"prg":21,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":117476,"vs_size":2064,"fs_off":119540,"fs_size":1416},{"prg":22,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":120956,"vs_size":3640,"fs_off":124596,"fs_size":1540},{"prg":23,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":126136,"vs_size":4140,"fs_off":130276,"fs_size":1540},{"prg":24,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":131816,"vs_size":5812,"fs_off":137628,"fs_size":1868},{"prg":25,"info":{"vs_uni":0,"fs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":139496,"vs_size":4976,"fs_off":144472,"fs_size":832},{"prg":26,"info":{"vs_uni":0,"fs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":145304,"vs_size":4440,"fs_off":149744,"fs_size":1984},{"prg":27,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":151728,"vs_size":5928,"fs_off":157656,"fs_size":4644},{"prg":28,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":162300,"vs_size":5928,"fs_off":168228,"fs_size":4240},{"prg":29,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":172468,"vs_size":5228,"fs_off":177696,"fs_size":2332},{"prg":30,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":180028,"vs_size":4772,"fs_off":184800,"fs_size":3332},{"prg":31,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":188132,"vs_size":3624,"fs_off":191756,"fs_size":2344},{"prg":32,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":194100,"vs_size":4468,"fs_off":198568,"fs_size":2508},{"prg":33,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":201076,"vs_size":4468,"fs_off":205544,"fs_size":2508},{"prg":34,"info":{"vs_uni":-1,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":208052,"vs_size":1104,"fs_off":209156,"fs_size":992},{"prg":35,"info":{"vs_uni":-1,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":210148,"vs_size":920,"fs_off":211068,"fs_size":1180},{"prg":36,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":212248,"vs_size":2044,"fs_off":214292,"fs_size":1904},{"prg":37,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":216196,"vs_size":2416,"fs_off":218612,"fs_size":1856},{"prg":38,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":220468,"vs_size":1880,"fs_off":222348,"fs_size":1628},{"prg":39,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":223976,"vs_size":1880,"fs_off":225856,"fs_size":1692},{"prg":40,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":227548,"vs_size":4280,"fs_off":231828,"fs_size":2552},{"prg":41,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":234380,"vs_size":4056,"fs_off":238436,"fs_size":1508},{"prg":42,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}]},"vs_off":239944,"vs_size":4204,"fs_off":244148,"fs_size":1756},{"prg":43,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":245904,"vs_size":4904,"fs_off":250808,"fs_size":2508},{"prg":44,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":253316,"vs_size":4904,"fs_off":258220,"fs_size":2508},{"prg":45,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":260728,"vs_size":4904,"fs_off":265632,"fs_size":2508},{"prg":46,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":268140,"vs_size":4904,"fs_off":273044,"fs_size":2508},{"prg":47,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":275552,"vs_size":4928,"fs_off":280480,"fs_size":2084},{"prg":48,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":282564,"vs_size":4412,"fs_off":286976,"fs_size":2084},{"prg":49,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}]},"vs_off":289060,"vs_size":6368,"fs_off":295428,"fs_size":3820},{"prg":50,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":299248,"vs_size":3492,"fs_off":302740,"fs_size":1616},{"prg":51,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":304356,"vs_size":5984,"fs_off":310340,"fs_size":2428},{"prg":52,"info":{"vs_uni":0,"fs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":312768,"vs_size":1924,"fs_off":314692,"fs_size":4236},{"prg":53,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_smaaArea","idx":2,"frag":1},{"name":"u_smaaSearch","idx":3,"frag":1}]},"vs_off":318928,"vs_size":2300,"fs_off":321228,"fs_size":12356},{"prg":54,"info":{"vs_uni":0,"fs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_blendingWeightTex","idx":2,"frag":1}]},"vs_off":333584,"vs_size":1372,"fs_off":334956,"fs_size":3696},{"prg":55,"info":{"vs_uni":0,"fs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}]},"vs_off":338652,"vs_size":1700,"fs_off":340352,"fs_size":892}] \ No newline at end of file +[{"prg":0,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":0,"vs_size":3920,"fs_off":3920,"fs_size":2712},{"prg":1,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":6632,"vs_size":3560,"fs_off":10192,"fs_size":1636},{"prg":2,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":11828,"vs_size":3708,"fs_off":15536,"fs_size":1884},{"prg":3,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":17420,"vs_size":4612,"fs_off":22032,"fs_size":2636},{"prg":4,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":24668,"vs_size":4612,"fs_off":29280,"fs_size":2636},{"prg":5,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":31916,"vs_size":4584,"fs_off":36500,"fs_size":2228},{"prg":6,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":38728,"vs_size":3916,"fs_off":42644,"fs_size":2228},{"prg":7,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":44872,"vs_size":3228,"fs_off":48100,"fs_size":2132},{"prg":8,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":50232,"vs_size":3228,"fs_off":53460,"fs_size":2132},{"prg":9,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":55592,"vs_size":3500,"fs_off":59092,"fs_size":1480},{"prg":10,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":60572,"vs_size":3500,"fs_off":64072,"fs_size":1480},{"prg":11,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":65552,"vs_size":3832,"fs_off":69384,"fs_size":2032},{"prg":12,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":71416,"vs_size":2860,"fs_off":74276,"fs_size":1480},{"prg":13,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":75756,"vs_size":5232,"fs_off":80988,"fs_size":1476},{"prg":14,"info":{"vs_uni":0,"tex":[],"fs_uni":-1},"vs_off":82464,"vs_size":5464,"fs_off":87928,"fs_size":1448},{"prg":15,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":89376,"vs_size":5600,"fs_off":94976,"fs_size":1972},{"prg":16,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":96948,"vs_size":4136,"fs_off":101084,"fs_size":1636},{"prg":17,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":102720,"vs_size":3500,"fs_off":106220,"fs_size":1480},{"prg":18,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":107700,"vs_size":3844,"fs_off":111544,"fs_size":2396},{"prg":19,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":113940,"vs_size":3664,"fs_off":117604,"fs_size":1844},{"prg":20,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":119448,"vs_size":1964,"fs_off":121412,"fs_size":1540},{"prg":21,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":122952,"vs_size":2176,"fs_off":125128,"fs_size":1540},{"prg":22,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":126668,"vs_size":3788,"fs_off":130456,"fs_size":1676},{"prg":23,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":132132,"vs_size":4272,"fs_off":136404,"fs_size":1676},{"prg":24,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":138080,"vs_size":5968,"fs_off":144048,"fs_size":1812},{"prg":25,"info":{"vs_uni":0,"tex":[],"fs_uni":-1},"vs_off":145860,"vs_size":5016,"fs_off":150876,"fs_size":464},{"prg":26,"info":{"vs_uni":0,"tex":[],"fs_uni":-1},"vs_off":151340,"vs_size":4484,"fs_off":155824,"fs_size":1632},{"prg":27,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":157456,"vs_size":6080,"fs_off":163536,"fs_size":4432},{"prg":28,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":167968,"vs_size":6080,"fs_off":174048,"fs_size":4028},{"prg":29,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":178076,"vs_size":5376,"fs_off":183452,"fs_size":2464},{"prg":30,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":185916,"vs_size":4924,"fs_off":190840,"fs_size":3128},{"prg":31,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":193968,"vs_size":3772,"fs_off":197740,"fs_size":2120},{"prg":32,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":199860,"vs_size":4612,"fs_off":204472,"fs_size":2636},{"prg":33,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":207108,"vs_size":4612,"fs_off":211720,"fs_size":2636},{"prg":34,"info":{"vs_uni":-1,"tex":[],"fs_uni":0},"vs_off":214356,"vs_size":1104,"fs_off":215460,"fs_size":616},{"prg":35,"info":{"vs_uni":-1,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":216076,"vs_size":920,"fs_off":216996,"fs_size":1152},{"prg":36,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":218148,"vs_size":2060,"fs_off":220208,"fs_size":1488},{"prg":37,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":221696,"vs_size":2388,"fs_off":224084,"fs_size":1856},{"prg":38,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":225940,"vs_size":1880,"fs_off":227820,"fs_size":1212},{"prg":39,"info":{"vs_uni":0,"tex":[],"fs_uni":0},"vs_off":229032,"vs_size":1880,"fs_off":230912,"fs_size":1276},{"prg":40,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0}],"fs_uni":0},"vs_off":232188,"vs_size":4428,"fs_off":236616,"fs_size":2712},{"prg":41,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":239328,"vs_size":4200,"fs_off":243528,"fs_size":1636},{"prg":42,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":245164,"vs_size":4348,"fs_off":249512,"fs_size":1884},{"prg":43,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":251396,"vs_size":5048,"fs_off":256444,"fs_size":2636},{"prg":44,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":259080,"vs_size":5048,"fs_off":264128,"fs_size":2636},{"prg":45,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":266764,"vs_size":5048,"fs_off":271812,"fs_size":2636},{"prg":46,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":274448,"vs_size":5048,"fs_off":279496,"fs_size":2636},{"prg":47,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":282132,"vs_size":5084,"fs_off":287216,"fs_size":2228},{"prg":48,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":0},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":289444,"vs_size":4556,"fs_off":294000,"fs_size":2228},{"prg":49,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_maskTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":296228,"vs_size":6476,"fs_off":302704,"fs_size":3952},{"prg":50,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":306656,"vs_size":3600,"fs_off":310256,"fs_size":1688},{"prg":51,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":0},"vs_off":311944,"vs_size":6012,"fs_off":317956,"fs_size":2532},{"prg":52,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":-1},"vs_off":320488,"vs_size":1916,"fs_off":322404,"fs_size":4236},{"prg":53,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_smaaArea","idx":2,"frag":1},{"name":"u_smaaSearch","idx":3,"frag":1}],"fs_uni":0},"vs_off":326640,"vs_size":2292,"fs_off":328932,"fs_size":12348},{"prg":54,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1},{"name":"u_blendingWeightTex","idx":2,"frag":1}],"fs_uni":0},"vs_off":341280,"vs_size":1364,"fs_off":342644,"fs_size":3688},{"prg":55,"info":{"vs_uni":0,"tex":[{"name":"u_colorTex","idx":1,"frag":1}],"fs_uni":-1},"vs_off":346332,"vs_size":1692,"fs_off":348024,"fs_size":892}] \ No newline at end of file diff --git a/data/vulkan_shaders/shaders_pack.spv b/data/vulkan_shaders/shaders_pack.spv index ac7f25de5b3e6a87c72af7f9194ece320d2b3d63..cf7b08f3a17c19b1ec62753a5ea46a4d886cf39c 100644 GIT binary patch delta 60170 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 OFdCS7dSr29$^QqIIo{0x delta 54738 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 } diff --git a/drape/gl_gpu_program.cpp b/drape/gl_gpu_program.cpp index 04471969fd..2778a38ec7 100644 --- a/drape/gl_gpu_program.cpp +++ b/drape/gl_gpu_program.cpp @@ -95,7 +95,7 @@ void GLGpuProgram::LoadUniformLocations() std::string name; GLFunctions::glGetActiveUniform(m_programID, static_cast(i), &size, &info.m_type, name); CHECK(kSupportedTypes.find(info.m_type) != kSupportedTypes.cend(), - ("Used uniform has unsupported type. Program =", m_programName, "Type =", info.m_type)); + ("Used uniform has unsupported type. Program =", m_programName, "; Type =", info.m_type, "; Name =", name)); info.m_location = GLFunctions::glGetUniformLocation(m_programID, name); m_uniforms[name] = std::move(info); diff --git a/shaders/GL/area.vsh.glsl b/shaders/GL/area.vsh.glsl index 7e787a829f..66b88cae8b 100644 --- a/shaders/GL/area.vsh.glsl +++ b/shaders/GL/area.vsh.glsl @@ -1,15 +1,26 @@ -in vec3 a_position; -in vec2 a_colorTexCoords; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_colorTexCoords; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_colorTexCoords; +#endif + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif void main() diff --git a/shaders/GL/area3d.vsh.glsl b/shaders/GL/area3d.vsh.glsl index 43c28f3373..9ace4cc361 100644 --- a/shaders/GL/area3d.vsh.glsl +++ b/shaders/GL/area3d.vsh.glsl @@ -1,34 +1,36 @@ -in vec3 a_position; -in vec3 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; +layout (location = 0) out vec2 v_colorTexCoords; +layout (location = 1) out float v_intensity; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_zScale; - -out vec2 v_colorTexCoords; -out float v_intensity; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; const vec4 kNormalizedLightDir = vec4(0.3162, 0.0, 0.9486, 0.0); void main() { vec4 pos = vec4(a_position, 1.0) * u_modelView; - vec4 normal = vec4(a_position + a_normal, 1.0) * u_modelView; normal.xyw = (normal * u_projection).xyw; normal.z = normal.z * u_zScale; - pos.xyw = (pos * u_projection).xyw; pos.z = a_position.z * u_zScale; - vec4 normDir = normal - pos; if (dot(normDir, normDir) != 0.0) v_intensity = max(0.0, -dot(kNormalizedLightDir, normalize(normDir))); else v_intensity = 0.0; - gl_Position = u_pivotTransform * pos; #ifdef VULKAN gl_Position.y = -gl_Position.y; diff --git a/shaders/GL/area3d_outline.vsh.glsl b/shaders/GL/area3d_outline.vsh.glsl index b488464c06..2b608d56af 100644 --- a/shaders/GL/area3d_outline.vsh.glsl +++ b/shaders/GL/area3d_outline.vsh.glsl @@ -1,16 +1,26 @@ -in vec3 a_position; -in vec2 a_colorTexCoords; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_zScale; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_colorTexCoords; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_colorTexCoords; +#endif + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif void main() @@ -23,7 +33,6 @@ void main() gl_Position.y = -gl_Position.y; gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5; #endif - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoords); #else diff --git a/shaders/GL/arrow3d.fsh.glsl b/shaders/GL/arrow3d.fsh.glsl index 3ac87ea523..a88df9fe4d 100644 --- a/shaders/GL/arrow3d.fsh.glsl +++ b/shaders/GL/arrow3d.fsh.glsl @@ -1,11 +1,17 @@ -in vec3 v_normal; +layout (location = 0) in vec3 v_normal; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; const vec3 lightDir = vec3(0.316, 0.0, 0.948); -uniform vec4 u_color; - -out vec4 v_FragColor; - void main() { float phongDiffuse = max(0.0, -dot(lightDir, v_normal)); diff --git a/shaders/GL/arrow3d.vsh.glsl b/shaders/GL/arrow3d.vsh.glsl index 5738237695..0b0c237883 100644 --- a/shaders/GL/arrow3d.vsh.glsl +++ b/shaders/GL/arrow3d.vsh.glsl @@ -1,10 +1,15 @@ -in vec3 a_pos; -in vec3 a_normal; +layout (location = 0) in vec3 a_pos; +layout (location = 1) in vec3 a_normal; -uniform mat4 u_transform; -uniform mat4 u_normalTransform; +layout (location = 0) out vec3 v_normal; -out vec3 v_normal; +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; void main() { diff --git a/shaders/GL/arrow3d_outline.fsh.glsl b/shaders/GL/arrow3d_outline.fsh.glsl index 810d0ef568..4bc8388f32 100644 --- a/shaders/GL/arrow3d_outline.fsh.glsl +++ b/shaders/GL/arrow3d_outline.fsh.glsl @@ -1,8 +1,14 @@ -in float v_intensity; +layout (location = 0) in float v_intensity; -uniform vec4 u_color; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; void main() { diff --git a/shaders/GL/arrow3d_shadow.fsh.glsl b/shaders/GL/arrow3d_shadow.fsh.glsl index 48c160ec98..40143c69ad 100644 --- a/shaders/GL/arrow3d_shadow.fsh.glsl +++ b/shaders/GL/arrow3d_shadow.fsh.glsl @@ -1,8 +1,14 @@ -in float v_intensity; +layout (location = 0) in float v_intensity; -uniform vec4 u_color; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; void main() { diff --git a/shaders/GL/arrow3d_shadow.vsh.glsl b/shaders/GL/arrow3d_shadow.vsh.glsl index 57860b9d65..97060408d3 100644 --- a/shaders/GL/arrow3d_shadow.vsh.glsl +++ b/shaders/GL/arrow3d_shadow.vsh.glsl @@ -1,9 +1,15 @@ -in vec3 a_pos; -in vec2 a_texCoords; +layout (location = 0) in vec3 a_pos; +layout (location = 1) in vec2 a_texCoords; -uniform mat4 u_transform; +layout (location = 0) out float v_intensity; -out float v_intensity; +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; void main() { diff --git a/shaders/GL/arrow3d_textured.fsh.glsl b/shaders/GL/arrow3d_textured.fsh.glsl index 8b67447edf..ac93c59a3b 100644 --- a/shaders/GL/arrow3d_textured.fsh.glsl +++ b/shaders/GL/arrow3d_textured.fsh.glsl @@ -1,14 +1,20 @@ -in vec3 v_normal; -in vec2 v_texCoords; +layout (location = 0) in vec3 v_normal; +layout (location = 1) in vec2 v_texCoords; -uniform sampler2D u_colorTex; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; const vec3 lightDir = vec3(0.316, 0.0, 0.948); -uniform vec4 u_color; - -out vec4 v_FragColor; - void main() { float phongDiffuse = max(0.0, -dot(lightDir, v_normal)); diff --git a/shaders/GL/arrow3d_textured.vsh.glsl b/shaders/GL/arrow3d_textured.vsh.glsl index ea0428f4e7..a6ad64b1f6 100644 --- a/shaders/GL/arrow3d_textured.vsh.glsl +++ b/shaders/GL/arrow3d_textured.vsh.glsl @@ -1,13 +1,17 @@ -in vec3 a_pos; -in vec3 a_normal; -in vec2 a_texCoords; +layout (location = 0) in vec3 a_pos; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec2 a_texCoords; -uniform mat4 u_transform; -uniform mat4 u_normalTransform; -uniform vec2 u_texCoordFlipping; +layout (location = 0) out vec3 v_normal; +layout (location = 1) out vec2 v_texCoords; -out vec3 v_normal; -out vec2 v_texCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_transform; + mat4 u_normalTransform; + vec4 u_color; + vec2 u_texCoordFlipping; +}; void main() { diff --git a/shaders/GL/circle.fsh.glsl b/shaders/GL/circle.fsh.glsl index 33f251b5c9..c75364b973 100644 --- a/shaders/GL/circle.fsh.glsl +++ b/shaders/GL/circle.fsh.glsl @@ -1,17 +1,30 @@ -uniform float u_opacity; #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoords; +layout (location = 1) in vec2 v_colorTexCoords; +#endif +layout (location = 2) in vec3 v_radius; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif -in vec3 v_radius; - const float aaPixelsCount = 2.5; -out vec4 v_FragColor; - void main() { #ifdef ENABLE_VTF @@ -19,7 +32,6 @@ void main() #else LOW_P vec4 finalColor = texture(u_colorTex, v_colorTexCoords); #endif - float smallRadius = v_radius.z - aaPixelsCount; float stepValue = smoothstep(smallRadius * smallRadius, v_radius.z * v_radius.z, v_radius.x * v_radius.x + v_radius.y * v_radius.y); diff --git a/shaders/GL/circle.vsh.glsl b/shaders/GL/circle.vsh.glsl index c94dcc8f49..b186af21c1 100644 --- a/shaders/GL/circle.vsh.glsl +++ b/shaders/GL/circle.vsh.glsl @@ -1,19 +1,29 @@ -in vec3 a_position; -in vec3 a_normal; -in vec2 a_colorTexCoords; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_colorTexCoords; #endif +layout (location = 2) out vec3 v_radius; -out vec3 v_radius; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; +#endif void main() { diff --git a/shaders/GL/circle_point.fsh.glsl b/shaders/GL/circle_point.fsh.glsl index 57fcd7dcbe..debb2230c2 100644 --- a/shaders/GL/circle_point.fsh.glsl +++ b/shaders/GL/circle_point.fsh.glsl @@ -1,20 +1,28 @@ -uniform float u_opacity; +layout (location = 0) in vec3 v_radius; +layout (location = 1) in vec4 v_color; -in vec3 v_radius; -in vec4 v_color; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; const float kAntialiasingScalar = 0.9; -out vec4 v_FragColor; - void main() { float d = dot(v_radius.xy, v_radius.xy); vec4 finalColor = v_color; - float aaRadius = v_radius.z * kAntialiasingScalar; float stepValue = smoothstep(aaRadius * aaRadius, v_radius.z * v_radius.z, d); finalColor.a = finalColor.a * u_opacity * (1.0 - stepValue); - v_FragColor = finalColor; } diff --git a/shaders/GL/circle_point.vsh.glsl b/shaders/GL/circle_point.vsh.glsl index 3b125dec4b..3a174db6b6 100644 --- a/shaders/GL/circle_point.vsh.glsl +++ b/shaders/GL/circle_point.vsh.glsl @@ -1,13 +1,21 @@ -in vec3 a_normal; -in vec3 a_position; -in vec4 a_color; +layout (location = 0) in vec3 a_normal; +layout (location = 1) in vec3 a_position; +layout (location = 2) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec3 v_radius; +layout (location = 1) out vec4 v_color; -out vec3 v_radius; -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { @@ -15,7 +23,6 @@ void main() vec4 pos = vec4(a_position.xy, 0, 1) * u_modelView; vec4 shiftedPos = vec4(radius.xy, 0, 0) + pos; gl_Position = applyPivotTransform(shiftedPos * u_projection, u_pivotTransform, 0.0); - v_radius = radius; v_color = a_color; } diff --git a/shaders/GL/colored_symbol.fsh.glsl b/shaders/GL/colored_symbol.fsh.glsl index 384460e47a..a43dc0a76c 100644 --- a/shaders/GL/colored_symbol.fsh.glsl +++ b/shaders/GL/colored_symbol.fsh.glsl @@ -1,16 +1,26 @@ -uniform float u_opacity; - -in vec4 v_normal; +layout (location = 0) in vec4 v_normal; #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 1) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoords; +layout (location = 2) in vec2 v_colorTexCoords; +layout (binding = 1) uniform sampler2D u_colorTex; #endif -const float aaPixelsCount = 2.5; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +const float aaPixelsCount = 2.5; void main() { @@ -19,16 +29,13 @@ void main() #else LOW_P vec4 color = texture(u_colorTex, v_colorTexCoords); #endif - float r1 = (v_normal.z - aaPixelsCount) * (v_normal.z - aaPixelsCount); float r2 = v_normal.x * v_normal.x + v_normal.y * v_normal.y; float r3 = v_normal.z * v_normal.z; float alpha = mix(step(r3, r2), smoothstep(r1, r3, r2), v_normal.w); - LOW_P vec4 finalColor = color; finalColor.a = finalColor.a * u_opacity * (1.0 - alpha); if (finalColor.a == 0.0) discard; - v_FragColor = finalColor; } diff --git a/shaders/GL/colored_symbol.vsh.glsl b/shaders/GL/colored_symbol.vsh.glsl index b253a9ce01..8b6b8beaa5 100644 --- a/shaders/GL/colored_symbol.vsh.glsl +++ b/shaders/GL/colored_symbol.vsh.glsl @@ -1,17 +1,28 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_colorTexCoords; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; - -out vec4 v_normal; +layout (location = 0) out vec4 v_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 1) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 2) out vec2 v_colorTexCoords; +#endif + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif void main() @@ -19,7 +30,6 @@ void main() vec4 p = vec4(a_position, 1) * u_modelView; vec4 pos = vec4(a_normal.xy + a_colorTexCoords.zw, 0, 0) + p; gl_Position = applyPivotTransform(pos * u_projection, u_pivotTransform, 0.0); - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoords.xy); #else diff --git a/shaders/GL/colored_symbol_billboard.vsh.glsl b/shaders/GL/colored_symbol_billboard.vsh.glsl index 93cbe4c8e6..b2ac3c6d30 100644 --- a/shaders/GL/colored_symbol_billboard.vsh.glsl +++ b/shaders/GL/colored_symbol_billboard.vsh.glsl @@ -1,17 +1,28 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_colorTexCoords; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; - -out vec4 v_normal; +layout (location = 0) out vec4 v_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 1) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 2) out vec2 v_colorTexCoords; +#endif + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif void main() @@ -19,7 +30,6 @@ void main() vec4 pivot = vec4(a_position.xyz, 1.0) * u_modelView; vec4 offset = vec4(a_normal.xy + a_colorTexCoords.zw, 0.0, 0.0) * u_projection; gl_Position = applyBillboardPivotTransform(pivot * u_projection, u_pivotTransform, 0.0, offset.xy); - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoords.xy); #else diff --git a/shaders/GL/dashed_line.fsh.glsl b/shaders/GL/dashed_line.fsh.glsl index 5cb47afe2b..beb0fb4169 100644 --- a/shaders/GL/dashed_line.fsh.glsl +++ b/shaders/GL/dashed_line.fsh.glsl @@ -1,26 +1,35 @@ -in vec2 v_colorTexCoord; -in vec2 v_maskTexCoord; -//in vec2 v_halfLength; +layout (location = 0) in vec2 v_colorTexCoord; +layout (location = 1) in vec2 v_maskTexCoord; +//layout (location = 2) in vec2 v_halfLength; -uniform sampler2D u_colorTex; -uniform sampler2D u_maskTex; -uniform float u_opacity; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; +layout (binding = 2) uniform sampler2D u_maskTex; //const float aaPixelsCount = 2.5; -out vec4 v_FragColor; - void main() { vec4 color = texture(u_colorTex, v_colorTexCoord); float mask = texture(u_maskTex, v_maskTexCoord).r; color.a = color.a * mask * u_opacity; - // Disabled too agressive AA-like blurring of edges, // see https://github.com/organicmaps/organicmaps/issues/6583. //float currentW = abs(v_halfLength.x); //float diff = v_halfLength.y - currentW; //color.a *= mix(0.3, 1.0, clamp(diff / aaPixelsCount, 0.0, 1.0)); - v_FragColor = color; } diff --git a/shaders/GL/dashed_line.vsh.glsl b/shaders/GL/dashed_line.vsh.glsl index d401e485df..355fa6e3c0 100644 --- a/shaders/GL/dashed_line.vsh.glsl +++ b/shaders/GL/dashed_line.vsh.glsl @@ -1,15 +1,23 @@ -in vec3 a_position; -in vec3 a_normal; -in vec2 a_colorTexCoord; -in vec4 a_maskTexCoord; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec2 a_colorTexCoord; +layout (location = 3) in vec4 a_maskTexCoord; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_maskTexCoord; +//layout (location = 2) out vec2 v_halfLength; -out vec2 v_colorTexCoord; -out vec2 v_maskTexCoord; -//out vec2 v_halfLength; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { @@ -21,12 +29,10 @@ void main() transformedAxisPos = calcLineTransformedAxisPos(transformedAxisPos, a_position.xy + normal, u_modelView, halfWidth); } - float uOffset = min(length(vec4(kShapeCoordScalar, 0, 0, 0) * u_modelView) * a_maskTexCoord.x, 1.0); v_colorTexCoord = a_colorTexCoord; v_maskTexCoord = vec2(a_maskTexCoord.y + uOffset * a_maskTexCoord.z, a_maskTexCoord.w); //v_halfLength = vec2(sign(a_normal.z) * halfWidth, abs(a_normal.z)); vec4 pos = vec4(transformedAxisPos, a_position.z, 1.0) * u_projection; - gl_Position = applyPivotTransform(pos, u_pivotTransform, 0.0); } diff --git a/shaders/GL/debug_rect.fsh.glsl b/shaders/GL/debug_rect.fsh.glsl index 513a572b25..b8bf153547 100644 --- a/shaders/GL/debug_rect.fsh.glsl +++ b/shaders/GL/debug_rect.fsh.glsl @@ -1,6 +1,9 @@ -uniform vec4 u_color; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + vec4 u_color; +}; void main() { diff --git a/shaders/GL/debug_rect.vsh.glsl b/shaders/GL/debug_rect.vsh.glsl index 7865de4e75..99070edf74 100644 --- a/shaders/GL/debug_rect.vsh.glsl +++ b/shaders/GL/debug_rect.vsh.glsl @@ -1,4 +1,4 @@ -in vec2 a_position; +layout (location = 0) in vec2 a_position; void main() { diff --git a/shaders/GL/hatching_area.fsh.glsl b/shaders/GL/hatching_area.fsh.glsl index e3069aa641..aa47ac1c2a 100644 --- a/shaders/GL/hatching_area.fsh.glsl +++ b/shaders/GL/hatching_area.fsh.glsl @@ -1,16 +1,26 @@ -uniform float u_opacity; - #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoords; +layout (location = 1) in vec2 v_colorTexCoords; +layout (binding = 1) uniform sampler2D u_colorTex; #endif +layout (location = 2) in vec2 v_maskTexCoords; -uniform sampler2D u_maskTex; -in vec2 v_maskTexCoords; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 2) uniform sampler2D u_maskTex; void main() { @@ -23,4 +33,3 @@ void main() color.a *= u_opacity; v_FragColor = color; } - diff --git a/shaders/GL/hatching_area.vsh.glsl b/shaders/GL/hatching_area.vsh.glsl index b2ebad946b..92565fec1a 100644 --- a/shaders/GL/hatching_area.vsh.glsl +++ b/shaders/GL/hatching_area.vsh.glsl @@ -1,18 +1,29 @@ -in vec3 a_position; -in vec2 a_colorTexCoords; -in vec2 a_maskTexCoords; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_colorTexCoords; +layout (location = 2) in vec2 a_maskTexCoords; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_colorTexCoords; +#endif +layout (location = 2) out vec2 v_maskTexCoords; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif -out vec2 v_maskTexCoords; void main() { diff --git a/shaders/GL/imgui.fsh.glsl b/shaders/GL/imgui.fsh.glsl index 53d77f3212..0114ac1443 100644 --- a/shaders/GL/imgui.fsh.glsl +++ b/shaders/GL/imgui.fsh.glsl @@ -1,9 +1,9 @@ -in vec2 v_texCoords; -in vec4 v_color; +layout (location = 0) in vec2 v_texCoords; +layout (location = 1) in vec4 v_color; -uniform sampler2D u_colorTex; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/imgui.vsh.glsl b/shaders/GL/imgui.vsh.glsl index ece5b5580d..a83b787811 100644 --- a/shaders/GL/imgui.vsh.glsl +++ b/shaders/GL/imgui.vsh.glsl @@ -1,11 +1,14 @@ -in vec2 a_position; -in vec2 a_texCoords; -in vec4 a_color; +layout (location = 0) in vec2 a_position; +layout (location = 1) in vec2 a_texCoords; +layout (location = 2) in vec4 a_color; -out vec2 v_texCoords; -out vec4 v_color; +layout (location = 0) out vec2 v_texCoords; +layout (location = 1) out vec4 v_color; -uniform mat4 u_projection; +layout (binding = 0) uniform UBO +{ + mat4 u_projection; +}; void main() { diff --git a/shaders/GL/line.fsh.glsl b/shaders/GL/line.fsh.glsl index 1f30bda0bd..3f640fc86a 100644 --- a/shaders/GL/line.fsh.glsl +++ b/shaders/GL/line.fsh.glsl @@ -1,17 +1,27 @@ -uniform float u_opacity; #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoord; +layout (location = 1) in vec2 v_colorTexCoord; +layout (binding = 1) uniform sampler2D u_colorTex; #endif +//layout (location = 2) in vec2 v_halfLength; -//in vec2 v_halfLength; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; //const float aaPixelsCount = 2.5; -out vec4 v_FragColor; - void main() { #ifdef ENABLE_VTF @@ -20,12 +30,10 @@ void main() LOW_P vec4 color = texture(u_colorTex, v_colorTexCoord); #endif color.a *= u_opacity; - // Disabled too agressive AA-like blurring of edges, // see https://github.com/organicmaps/organicmaps/issues/6583. //float currentW = abs(v_halfLength.x); //float diff = v_halfLength.y - currentW; //color.a *= mix(0.3, 1.0, clamp(diff / aaPixelsCount, 0.0, 1.0)); - v_FragColor = color; } diff --git a/shaders/GL/line.vsh.glsl b/shaders/GL/line.vsh.glsl index 75cd446cdd..122e03dd23 100644 --- a/shaders/GL/line.vsh.glsl +++ b/shaders/GL/line.vsh.glsl @@ -1,19 +1,30 @@ -in vec3 a_position; -in vec3 a_normal; -in vec2 a_colorTexCoord; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec2 a_colorTexCoord; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif -//out vec2 v_halfLength; +//layout (location = 2) out vec2 v_halfLength; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; +#endif void main() { @@ -25,7 +36,6 @@ void main() transformedAxisPos = calcLineTransformedAxisPos(transformedAxisPos, a_position.xy + normal, u_modelView, halfWidth); } - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoord); #else diff --git a/shaders/GL/masked_texturing.fsh.glsl b/shaders/GL/masked_texturing.fsh.glsl index bae0daed7d..24553f694f 100644 --- a/shaders/GL/masked_texturing.fsh.glsl +++ b/shaders/GL/masked_texturing.fsh.glsl @@ -1,11 +1,22 @@ -uniform sampler2D u_colorTex; -uniform sampler2D u_maskTex; -uniform float u_opacity; +layout (location = 0) in vec2 v_colorTexCoords; +layout (location = 1) in vec2 v_maskTexCoords; -in vec2 v_colorTexCoords; -in vec2 v_maskTexCoords; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; +layout (binding = 2) uniform sampler2D u_maskTex; void main() { diff --git a/shaders/GL/masked_texturing.vsh.glsl b/shaders/GL/masked_texturing.vsh.glsl index 69864b283a..1f6d9a1e51 100644 --- a/shaders/GL/masked_texturing.vsh.glsl +++ b/shaders/GL/masked_texturing.vsh.glsl @@ -1,14 +1,22 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; -in vec2 a_maskTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; +layout (location = 3) in vec2 a_maskTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_maskTexCoords; -out vec2 v_colorTexCoords; -out vec2 v_maskTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { diff --git a/shaders/GL/masked_texturing_billboard.vsh.glsl b/shaders/GL/masked_texturing_billboard.vsh.glsl index 5c79287550..0caccd80e1 100644 --- a/shaders/GL/masked_texturing_billboard.vsh.glsl +++ b/shaders/GL/masked_texturing_billboard.vsh.glsl @@ -1,15 +1,22 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; -in vec2 a_maskTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; +layout (location = 3) in vec2 a_maskTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_zScale; +layout (location = 0) out vec2 v_colorTexCoords; +layout (location = 1) out vec2 v_maskTexCoords; -out vec2 v_colorTexCoords; -out vec2 v_maskTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { diff --git a/shaders/GL/my_position.vsh.glsl b/shaders/GL/my_position.vsh.glsl index 21575b727c..8489cc6ad6 100644 --- a/shaders/GL/my_position.vsh.glsl +++ b/shaders/GL/my_position.vsh.glsl @@ -1,30 +1,33 @@ -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec2 a_normal; +layout (location = 1) in vec2 a_colorTexCoords; -uniform vec3 u_position; -uniform float u_azimut; +layout (location = 0) out vec2 v_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; - -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_position; + vec2 u_lineParams; + float u_accuracy; + float u_zScale; + float u_opacity; + float u_azimut; +}; void main() { float sinV = sin(u_azimut); float cosV = cos(u_azimut); - mat4 rotation; rotation[0] = vec4(cosV, sinV, 0.0, 0.0); rotation[1] = vec4(-sinV, cosV, 0.0, 0.0); rotation[2] = vec4(0.0, 0.0, 1.0, 0.0); rotation[3] = vec4(0.0, 0.0, 0.0, 1.0); - - vec4 pos = vec4(u_position, 1.0) * u_modelView; + vec4 pos = vec4(u_position.xyz, 1.0) * u_modelView; vec4 normal = vec4(a_normal, 0, 0); vec4 shiftedPos = normal * rotation + pos; - gl_Position = applyPivotTransform(shiftedPos * u_projection, u_pivotTransform, 0.0); v_colorTexCoords = a_colorTexCoords; } diff --git a/shaders/GL/path_symbol.vsh.glsl b/shaders/GL/path_symbol.vsh.glsl index abfd416ca6..72d81d96b9 100644 --- a/shaders/GL/path_symbol.vsh.glsl +++ b/shaders/GL/path_symbol.vsh.glsl @@ -1,23 +1,29 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoords; -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { vec4 pos = vec4(a_position.xyz, 1) * u_modelView; - float normalLen = length(a_normal); vec4 n = vec4(a_position.xy + a_normal * kShapeCoordScalar, 0.0, 0.0) * u_modelView; vec4 norm = vec4(0.0, 0.0, 0.0, 0.0); if (dot(n, n) != 0.0) norm = normalize(n) * normalLen; - vec4 shiftedPos = norm + pos; gl_Position = applyPivotTransform(shiftedPos * u_projection, u_pivotTransform, 0.0); v_colorTexCoords = a_colorTexCoords; diff --git a/shaders/GL/position_accuracy3d.vsh.glsl b/shaders/GL/position_accuracy3d.vsh.glsl index 5a0f815d49..196c6d7363 100644 --- a/shaders/GL/position_accuracy3d.vsh.glsl +++ b/shaders/GL/position_accuracy3d.vsh.glsl @@ -1,15 +1,20 @@ -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec2 a_normal; +layout (location = 1) in vec2 a_colorTexCoords; -uniform vec3 u_position; -uniform float u_accuracy; +layout (location = 0) out vec2 v_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_zScale; - -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_position; + vec2 u_lineParams; + float u_accuracy; + float u_zScale; + float u_opacity; + float u_azimut; +}; void main() { @@ -17,6 +22,5 @@ void main() vec4 normal = vec4(a_normal * u_accuracy, 0.0, 0.0); position = (position + normal) * u_projection; gl_Position = applyPivotTransform(position, u_pivotTransform, u_position.z * u_zScale); - v_colorTexCoords = a_colorTexCoords; } diff --git a/shaders/GL/route.fsh.glsl b/shaders/GL/route.fsh.glsl index bc7d28acc5..fab19eedc7 100644 --- a/shaders/GL/route.fsh.glsl +++ b/shaders/GL/route.fsh.glsl @@ -1,38 +1,43 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -in vec3 v_length; -in vec4 v_color; +layout (location = 0) in vec3 v_length; +layout (location = 1) in vec4 v_color; -uniform vec4 u_color; -uniform vec4 u_outlineColor; -uniform vec4 u_routeParams; -uniform vec4 u_maskColor; +layout (location = 0) out vec4 v_FragColor; -uniform vec2 u_fakeBorders; -uniform vec4 u_fakeColor; -uniform vec4 u_fakeOutlineColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; const float kAntialiasingThreshold = 0.92; - const float kOutlineThreshold1 = 0.81; const float kOutlineThreshold2 = 0.71; -out vec4 v_FragColor; - void main() { if (v_length.x < v_length.z) discard; - vec2 coefs = step(v_length.xx, u_fakeBorders); coefs.y = 1.0 - coefs.y; vec4 mainColor = mix(u_color, u_fakeColor, coefs.x); mainColor = mix(mainColor, u_fakeColor, coefs.y); vec4 mainOutlineColor = mix(u_outlineColor, u_fakeOutlineColor, coefs.x); mainOutlineColor = mix(mainOutlineColor, u_fakeOutlineColor, coefs.y); - vec4 color = mix(mix(mainColor, vec4(v_color.rgb, 1.0), v_color.a), mainColor, step(u_routeParams.w, 0.0)); color = mix(color, mainOutlineColor, step(kOutlineThreshold1, abs(v_length.y))); color = mix(color, mainOutlineColor, smoothstep(kOutlineThreshold2, kOutlineThreshold1, abs(v_length.y))); diff --git a/shaders/GL/route.vsh.glsl b/shaders/GL/route.vsh.glsl index 9fe52f316e..5915b92afa 100644 --- a/shaders/GL/route.vsh.glsl +++ b/shaders/GL/route.vsh.glsl @@ -1,16 +1,28 @@ -in vec3 a_position; -in vec2 a_normal; -in vec3 a_length; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec3 a_length; +layout (location = 3) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec3 v_length; +layout (location = 1) out vec4 v_color; -uniform vec4 u_routeParams; - -out vec3 v_length; -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; void main() { @@ -24,7 +36,6 @@ void main() if (u_routeParams.y != 0.0) len = vec2(a_length.x + a_length.y * u_routeParams.y, a_length.z); } - v_length = vec3(len, u_routeParams.z); v_color = a_color; vec4 pos = vec4(transformedAxisPos, a_position.z, 1.0) * u_projection; diff --git a/shaders/GL/route_arrow.fsh.glsl b/shaders/GL/route_arrow.fsh.glsl index 5b5bad2c0c..c926c7f50c 100644 --- a/shaders/GL/route_arrow.fsh.glsl +++ b/shaders/GL/route_arrow.fsh.glsl @@ -1,14 +1,29 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -uniform sampler2D u_colorTex; -uniform float u_opacity; -uniform vec4 u_maskColor; +layout (location = 0) in vec2 v_colorTexCoords; -in vec2 v_colorTexCoords; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/route_arrow.vsh.glsl b/shaders/GL/route_arrow.vsh.glsl index 764dba5e42..93a742dab2 100644 --- a/shaders/GL/route_arrow.vsh.glsl +++ b/shaders/GL/route_arrow.vsh.glsl @@ -1,14 +1,26 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoords; -uniform float u_arrowHalfWidth; - -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; void main() { @@ -19,9 +31,7 @@ void main() transformedAxisPos = calcLineTransformedAxisPos(transformedAxisPos, a_position.xy + norm, u_modelView, length(norm)); } - v_colorTexCoords = a_colorTexCoords; - vec4 pos = vec4(transformedAxisPos, a_position.z, 1.0) * u_projection; gl_Position = applyPivotTransform(pos, u_pivotTransform, 0.0); } diff --git a/shaders/GL/route_dash.fsh.glsl b/shaders/GL/route_dash.fsh.glsl index 3f9556339c..1f928e041d 100644 --- a/shaders/GL/route_dash.fsh.glsl +++ b/shaders/GL/route_dash.fsh.glsl @@ -1,16 +1,28 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -in vec3 v_length; -in vec4 v_color; +layout (location = 0) in vec3 v_length; +layout (location = 1) in vec4 v_color; -uniform vec4 u_color; -uniform vec2 u_pattern; -uniform vec4 u_maskColor; +layout (location = 0) out vec4 v_FragColor; -uniform vec2 u_fakeBorders; -uniform vec4 u_fakeColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; const float kAntialiasingThreshold = 0.92; @@ -21,18 +33,14 @@ float alphaFromPattern(float curLen, float dashLen, float gapLen) return step(offset, dashLen); } -out vec4 v_FragColor; - void main() { if (v_length.x < v_length.z) discard; - vec2 coefs = step(v_length.xx, u_fakeBorders); coefs.y = 1.0 - coefs.y; vec4 mainColor = mix(u_color, u_fakeColor, coefs.x); mainColor = mix(mainColor, u_fakeColor, coefs.y); - vec4 color = mainColor + v_color; color.a *= (1.0 - smoothstep(kAntialiasingThreshold, 1.0, abs(v_length.y))) * alphaFromPattern(v_length.x, u_pattern.x, u_pattern.y); diff --git a/shaders/GL/route_marker.fsh.glsl b/shaders/GL/route_marker.fsh.glsl index fee0c9efc8..95bca7fdbe 100644 --- a/shaders/GL/route_marker.fsh.glsl +++ b/shaders/GL/route_marker.fsh.glsl @@ -1,29 +1,40 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -uniform vec4 u_routeParams; -uniform vec4 u_maskColor; -uniform float u_opacity; +layout (location = 0) in vec4 v_radius; +layout (location = 1) in vec4 v_color; -in vec4 v_radius; -in vec4 v_color; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; const float kAntialiasingPixelsCount = 2.5; -out vec4 v_FragColor; - void main() { vec4 finalColor = v_color; - float aaRadius = max(v_radius.z - kAntialiasingPixelsCount, 0.0); float stepValue = smoothstep(aaRadius * aaRadius, v_radius.z * v_radius.z, dot(v_radius.xy, v_radius.xy)); finalColor.a = finalColor.a * u_opacity * (1.0 - stepValue); if (finalColor.a < 0.01 || u_routeParams.y > v_radius.w) discard; - finalColor = vec4(mix(finalColor.rgb, u_maskColor.rgb, u_maskColor.a), finalColor.a); v_FragColor = finalColor; } diff --git a/shaders/GL/route_marker.vsh.glsl b/shaders/GL/route_marker.vsh.glsl index 7ca104e1b9..7bee7f473f 100644 --- a/shaders/GL/route_marker.vsh.glsl +++ b/shaders/GL/route_marker.vsh.glsl @@ -1,16 +1,27 @@ -in vec4 a_position; -in vec3 a_normal; -in vec4 a_color; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec3 a_normal; +layout (location = 2) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec4 v_radius; +layout (location = 1) out vec4 v_color; -uniform vec2 u_angleCosSin; -uniform vec4 u_routeParams; - -out vec4 v_radius; -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_routeParams; + vec4 u_color; + vec4 u_maskColor; + vec4 u_outlineColor; + vec4 u_fakeColor; + vec4 u_fakeOutlineColor; + vec2 u_fakeBorders; + vec2 u_pattern; + vec2 u_angleCosSin; + float u_arrowHalfWidth; + float u_opacity; +}; void main() { diff --git a/shaders/GL/ruler.fsh.glsl b/shaders/GL/ruler.fsh.glsl new file mode 100644 index 0000000000..667d16c4fa --- /dev/null +++ b/shaders/GL/ruler.fsh.glsl @@ -0,0 +1,23 @@ +layout (location = 0) in vec2 v_colorTexCoords; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; + +void main() +{ + vec4 finalColor = texture(u_colorTex, v_colorTexCoords); + finalColor.a *= u_opacity; + v_FragColor = finalColor; +} diff --git a/shaders/GL/ruler.vsh.glsl b/shaders/GL/ruler.vsh.glsl index 27c670853d..434df4c5f3 100644 --- a/shaders/GL/ruler.vsh.glsl +++ b/shaders/GL/ruler.vsh.glsl @@ -1,12 +1,19 @@ -in vec2 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec2 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; -uniform vec2 u_position; -uniform float u_length; -uniform mat4 u_projection; +layout (location = 0) out vec2 v_colorTexCoords; -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; void main() { diff --git a/shaders/GL/screen_quad.fsh.glsl b/shaders/GL/screen_quad.fsh.glsl new file mode 100644 index 0000000000..d30f795529 --- /dev/null +++ b/shaders/GL/screen_quad.fsh.glsl @@ -0,0 +1,17 @@ +layout (location = 0) in vec2 v_colorTexCoords; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + float u_opacity; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; + +void main() +{ + vec4 finalColor = texture(u_colorTex, v_colorTexCoords); + finalColor.a *= u_opacity; + v_FragColor = finalColor; +} diff --git a/shaders/GL/screen_quad.vsh.glsl b/shaders/GL/screen_quad.vsh.glsl index 78b4b5f8ae..11485fc5a1 100644 --- a/shaders/GL/screen_quad.vsh.glsl +++ b/shaders/GL/screen_quad.vsh.glsl @@ -1,11 +1,10 @@ -in vec2 a_pos; -in vec2 a_tcoord; +layout (location = 0) in vec2 a_pos; +layout (location = 1) in vec2 a_tcoord; -out vec2 v_colorTexCoords; +layout (location = 0) out vec2 v_colorTexCoords; void main() { v_colorTexCoords = a_tcoord; gl_Position = vec4(a_pos, 0.0, 1.0); } - diff --git a/shaders/GL/selection_line.fsh.glsl b/shaders/GL/selection_line.fsh.glsl index c9749c9a2a..55a832c62f 100644 --- a/shaders/GL/selection_line.fsh.glsl +++ b/shaders/GL/selection_line.fsh.glsl @@ -1,17 +1,28 @@ #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoord; +layout (location = 1) in vec2 v_colorTexCoord; +layout (binding = 1) uniform sampler2D u_colorTex; #endif -uniform float u_opacity; +layout (location = 2) in float v_lengthY; -in float v_lengthY; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_position; + vec2 u_lineParams; + float u_accuracy; + float u_zScale; + float u_opacity; + float u_azimut; +}; const float kAntialiasingThreshold = 0.92; -out vec4 v_FragColor; - void main() { #ifdef ENABLE_VTF @@ -21,6 +32,5 @@ void main() #endif color.a *= u_opacity; color.a *= (1.0 - smoothstep(kAntialiasingThreshold, 1.0, abs(v_lengthY))); - v_FragColor = color; } diff --git a/shaders/GL/selection_line.vsh.glsl b/shaders/GL/selection_line.vsh.glsl index b9d9e693f7..4c262ff691 100644 --- a/shaders/GL/selection_line.vsh.glsl +++ b/shaders/GL/selection_line.vsh.glsl @@ -1,22 +1,33 @@ -in vec3 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; -in vec3 a_length; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; - -uniform vec2 u_lineParams; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; +layout (location = 3) in vec3 a_length; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; +#endif +layout (location = 2) out float v_lengthY; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_position; + vec2 u_lineParams; + float u_accuracy; + float u_zScale; + float u_opacity; + float u_azimut; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; #endif -out float v_lengthY; +const float kAntialiasingThreshold = 0.92; void main() { @@ -30,7 +41,6 @@ void main() if (u_lineParams.y != 0.0) len = vec2(a_length.x + a_length.y * u_lineParams.y, a_length.z); } - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoords); #else diff --git a/shaders/GL/shader_index.txt b/shaders/GL/shader_index.txt index 9decc59502..c7271a255a 100644 --- a/shaders/GL/shader_index.txt +++ b/shaders/GL/shader_index.txt @@ -5,8 +5,8 @@ Bookmark user_mark.vsh.glsl user_mark.fsh.glsl BookmarkAnim user_mark.vsh.glsl user_mark.fsh.glsl TextOutlined text_outlined.vsh.glsl text.fsh.glsl Text text.vsh.glsl text.fsh.glsl -TextStaticOutlinedGui text_outlined_gui.vsh.glsl text.fsh.glsl -TextOutlinedGui text_outlined_gui.vsh.glsl text.fsh.glsl +TextStaticOutlinedGui text_outlined_gui.vsh.glsl text_outlined_gui.fsh.glsl +TextOutlinedGui text_outlined_gui.vsh.glsl text_outlined_gui.fsh.glsl Area area.vsh.glsl solid_color.fsh.glsl AreaOutline area.vsh.glsl solid_color.fsh.glsl Area3d area3d.vsh.glsl texturing3d.fsh.glsl @@ -18,10 +18,10 @@ PathSymbol path_symbol.vsh.glsl texturing.fsh.glsl TransparentArea area.vsh.glsl solid_color.fsh.glsl CapJoin circle.vsh.glsl circle.fsh.glsl HatchingArea hatching_area.vsh.glsl hatching_area.fsh.glsl -TexturingGui texturing_gui.vsh.glsl texturing.fsh.glsl -Ruler ruler.vsh.glsl texturing.fsh.glsl -Accuracy position_accuracy3d.vsh.glsl texturing.fsh.glsl -MyPosition my_position.vsh.glsl texturing.fsh.glsl +TexturingGui texturing_gui.vsh.glsl texturing_gui.fsh.glsl +Ruler ruler.vsh.glsl ruler.fsh.glsl +Accuracy position_accuracy3d.vsh.glsl texturing_position.fsh.glsl +MyPosition my_position.vsh.glsl texturing_position.fsh.glsl SelectionLine selection_line.vsh.glsl selection_line.fsh.glsl Transit transit.vsh.glsl transit.fsh.glsl TransitMarker transit_marker.vsh.glsl transit_marker.fsh.glsl @@ -33,7 +33,7 @@ CirclePoint circle_point.vsh.glsl circle_point.fsh.glsl BookmarkAboveText user_mark.vsh.glsl user_mark.fsh.glsl BookmarkAnimAboveText user_mark.vsh.glsl user_mark.fsh.glsl DebugRect debug_rect.vsh.glsl debug_rect.fsh.glsl -ScreenQuad screen_quad.vsh.glsl texturing.fsh.glsl +ScreenQuad screen_quad.vsh.glsl screen_quad.fsh.glsl Arrow3d arrow3d.vsh.glsl arrow3d.fsh.glsl Arrow3dTextured arrow3d_textured.vsh.glsl arrow3d_textured.fsh.glsl Arrow3dShadow arrow3d_shadow.vsh.glsl arrow3d_shadow.fsh.glsl diff --git a/shaders/GL/smaa_blending_weight.fsh.glsl b/shaders/GL/smaa_blending_weight.fsh.glsl index c34e27f8d8..15aec1ce80 100644 --- a/shaders/GL/smaa_blending_weight.fsh.glsl +++ b/shaders/GL/smaa_blending_weight.fsh.glsl @@ -1,21 +1,24 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec4 v_coords; +layout (location = 1) in vec4 v_offset0; +layout (location = 2) in vec4 v_offset1; +layout (location = 3) in vec4 v_offset2; -uniform sampler2D u_colorTex; -uniform sampler2D u_smaaArea; -uniform sampler2D u_smaaSearch; +layout (location = 0) out vec4 v_FragColor; -uniform vec4 u_framebufferMetrics; +layout (binding = 0) uniform UBO +{ + vec4 u_framebufferMetrics; +}; -in vec4 v_coords; -in vec4 v_offset0; -in vec4 v_offset1; -in vec4 v_offset2; +layout (binding = 1) uniform sampler2D u_colorTex; +layout (binding = 2) uniform sampler2D u_smaaArea; +layout (binding = 3) uniform sampler2D u_smaaSearch; #define SMAA_SEARCHTEX_SIZE vec2(66.0, 33.0) #define SMAA_SEARCHTEX_PACKED_SIZE vec2(64.0, 16.0) #define SMAA_AREATEX_MAX_DISTANCE 16.0 #define SMAA_AREATEX_PIXEL_SIZE (vec2(1.0 / 256.0, 1.0 / 1024.0)) - #define SMAALoopBegin(condition) while (condition) { #define SMAALoopEnd } #define SMAASampleLevelZero(tex, coord) textureLod(tex, coord, 0.0) @@ -32,16 +35,13 @@ float SMAASearchLength(vec2 e, float offset) // of the space horizontally. vec2 scale = SMAA_SEARCHTEX_SIZE * vec2(0.5, -1.0); vec2 bias = SMAA_SEARCHTEX_SIZE * vec2(offset, 1.0); - // Scale and bias to access texel centers. scale += vec2(-1.0, 1.0); bias += vec2( 0.5, -0.5); - // Convert from pixel coordinates to texcoords. // (We use SMAA_SEARCHTEX_PACKED_SIZE because the texture is cropped). scale *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE; bias *= 1.0 / SMAA_SEARCHTEX_PACKED_SIZE; - // Lookup the search texture. return SMAASampleLevelZero(u_smaaSearch, scale * e + bias).r; } @@ -101,79 +101,60 @@ vec2 SMAAArea(vec2 dist, float e1, float e2) return SMAASampleLevelZero(u_smaaArea, texcoord).rg; } -out vec4 v_FragColor; - void main() { vec4 weights = vec4(0.0, 0.0, 0.0, 0.0); vec2 e = texture(u_colorTex, v_coords.xy).rg; - if (e.g > 0.0) // Edge at north { vec2 d; - // Find the distance to the left. vec3 coords; coords.x = SMAASearchXLeft(v_offset0.xy, v_offset2.x); coords.y = v_offset1.y; d.x = coords.x; - // Now fetch the left crossing edges, two at a time using bilinear // filtering. Sampling at -0.25 enables to discern what value each edge has. float e1 = SMAASampleLevelZero(u_colorTex, coords.xy).r; - // Find the distance to the right. coords.z = SMAASearchXRight(v_offset0.zw, v_offset2.y); d.y = coords.z; - // We want the distances to be in pixel units (doing this here allow to // better interleave arithmetic and memory accesses). vec2 zz = u_framebufferMetrics.zz; d = abs(SMAARound(zz * d - v_coords.zz)); - // SMAAArea below needs a sqrt, as the areas texture is compressed // quadratically. vec2 sqrt_d = sqrt(d); - // Fetch the right crossing edges. float e2 = SMAASampleLevelZeroOffset(u_colorTex, coords.zy, SMAAOffset(1, 0)).r; - // Here we know how this pattern looks like, now it is time for getting // the actual area. weights.rg = SMAAArea(sqrt_d, e1, e2); } - if (e.r > 0.0) // Edge at west { vec2 d; - // Find the distance to the top. vec3 coords; coords.y = SMAASearchYUp(v_offset1.xy, v_offset2.z); coords.x = v_offset0.x; d.x = coords.y; - // Fetch the top crossing edges. float e1 = SMAASampleLevelZero(u_colorTex, coords.xy).g; - // Find the distance to the bottom. coords.z = SMAASearchYDown(v_offset1.zw, v_offset2.w); d.y = coords.z; - // We want the distances to be in pixel units. vec2 ww = u_framebufferMetrics.ww; d = abs(SMAARound(ww * d - v_coords.ww)); - // SMAAArea below needs a sqrt, as the areas texture is compressed // quadratically. vec2 sqrt_d = sqrt(d); - // Fetch the bottom crossing edges. float e2 = SMAASampleLevelZeroOffset(u_colorTex, coords.xz, SMAAOffset(0, 1)).g; - // Get the area for this direction. weights.ba = SMAAArea(sqrt_d, e1, e2); } - v_FragColor = weights; } diff --git a/shaders/GL/smaa_blending_weight.vsh.glsl b/shaders/GL/smaa_blending_weight.vsh.glsl index afccac1226..56444480c3 100644 --- a/shaders/GL/smaa_blending_weight.vsh.glsl +++ b/shaders/GL/smaa_blending_weight.vsh.glsl @@ -1,14 +1,16 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec2 a_pos; +layout (location = 1) in vec2 a_tcoord; -in vec2 a_pos; -in vec2 a_tcoord; +layout (location = 0) out vec4 v_coords; +layout (location = 1) out vec4 v_offset0; +layout (location = 2) out vec4 v_offset1; +layout (location = 3) out vec4 v_offset2; -uniform vec4 u_framebufferMetrics; - -out vec4 v_coords; -out vec4 v_offset0; -out vec4 v_offset1; -out vec4 v_offset2; +layout (binding = 0) uniform UBO +{ + vec4 u_framebufferMetrics; +}; // SMAA_MAX_SEARCH_STEPS specifies the maximum steps performed in the // horizontal/vertical pattern searches, at each side of the pixel. diff --git a/shaders/GL/smaa_edges.fsh.glsl b/shaders/GL/smaa_edges.fsh.glsl index 6fcf641e69..a9efdf7d66 100644 --- a/shaders/GL/smaa_edges.fsh.glsl +++ b/shaders/GL/smaa_edges.fsh.glsl @@ -1,11 +1,12 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec2 v_colorTexCoords; +layout (location = 1) in vec4 v_offset0; +layout (location = 2) in vec4 v_offset1; +layout (location = 3) in vec4 v_offset2; -uniform sampler2D u_colorTex; +layout (location = 0) out vec4 v_FragColor; -in vec2 v_colorTexCoords; -in vec4 v_offset0; -in vec4 v_offset1; -in vec4 v_offset2; +layout (binding = 1) uniform sampler2D u_colorTex; // SMAA_THRESHOLD specifies the threshold or sensitivity to edges. // Lowering this value you will be able to detect more edges at the expense of @@ -22,46 +23,36 @@ const vec2 kThreshold = vec2(SMAA_THRESHOLD, SMAA_THRESHOLD); // that, if there is too much contrast in a direction, that will hide // perceptually contrast in the other neighbors. #define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 2.0 - // Standard relative luminance weights. // https://en.wikipedia.org/wiki/Relative_luminance const vec3 kWeights = vec3(0.2126, 0.7152, 0.0722); -out vec4 v_FragColor; - void main() { // Calculate lumas. float L = dot(texture(u_colorTex, v_colorTexCoords).rgb, kWeights); float Lleft = dot(texture(u_colorTex, v_offset0.xy).rgb, kWeights); float Ltop = dot(texture(u_colorTex, v_offset0.zw).rgb, kWeights); - // We do the usual threshold. vec4 delta; delta.xy = abs(L - vec2(Lleft, Ltop)); vec2 edges = step(kThreshold, delta.xy); if (dot(edges, vec2(1.0, 1.0)) == 0.0) discard; - // Calculate right and bottom deltas. float Lright = dot(texture(u_colorTex, v_offset1.xy).rgb, kWeights); float Lbottom = dot(texture(u_colorTex, v_offset1.zw).rgb, kWeights); delta.zw = abs(L - vec2(Lright, Lbottom)); - // Calculate the maximum delta in the direct neighborhood. vec2 maxDelta = max(delta.xy, delta.zw); - // Calculate left-left and top-top deltas. float Lleftleft = dot(texture(u_colorTex, v_offset2.xy).rgb, kWeights); float Ltoptop = dot(texture(u_colorTex, v_offset2.zw).rgb, kWeights); delta.zw = abs(vec2(Lleft, Ltop) - vec2(Lleftleft, Ltoptop)); - // Calculate the final maximum delta. maxDelta = max(maxDelta.xy, delta.zw); float finalDelta = max(maxDelta.x, maxDelta.y); - // Local contrast adaptation edges *= step(finalDelta, SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR * delta.xy); - v_FragColor = vec4(edges, 0.0, 1.0); } diff --git a/shaders/GL/smaa_edges.vsh.glsl b/shaders/GL/smaa_edges.vsh.glsl index aa70aff814..67dc428804 100644 --- a/shaders/GL/smaa_edges.vsh.glsl +++ b/shaders/GL/smaa_edges.vsh.glsl @@ -1,14 +1,16 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec2 a_pos; +layout (location = 1) in vec2 a_tcoord; -in vec2 a_pos; -in vec2 a_tcoord; +layout (location = 0) out vec2 v_colorTexCoords; +layout (location = 1) out vec4 v_offset0; +layout (location = 2) out vec4 v_offset1; +layout (location = 3) out vec4 v_offset2; -uniform vec4 u_framebufferMetrics; - -out vec2 v_colorTexCoords; -out vec4 v_offset0; -out vec4 v_offset1; -out vec4 v_offset2; +layout (binding = 0) uniform UBO +{ + vec4 u_framebufferMetrics; +}; void main() { @@ -18,4 +20,3 @@ void main() v_offset2 = u_framebufferMetrics.xyxy * vec4(-2.0, 0.0, 0.0, -2.0) + a_tcoord.xyxy; gl_Position = vec4(a_pos, 0.0, 1.0); } - diff --git a/shaders/GL/smaa_final.fsh.glsl b/shaders/GL/smaa_final.fsh.glsl index f8bac1636d..767f34c8a9 100644 --- a/shaders/GL/smaa_final.fsh.glsl +++ b/shaders/GL/smaa_final.fsh.glsl @@ -1,17 +1,20 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec2 v_colorTexCoords; +layout (location = 1) in vec4 v_offset; -uniform sampler2D u_colorTex; -uniform sampler2D u_blendingWeightTex; +layout (location = 0) out vec4 v_FragColor; -uniform vec4 u_framebufferMetrics; +layout (binding = 0) uniform UBO +{ + vec4 u_framebufferMetrics; +}; -in vec2 v_colorTexCoords; -in vec4 v_offset; +layout (binding = 1) uniform sampler2D u_colorTex; + +layout (binding = 2) uniform sampler2D u_blendingWeightTex; #define SMAASampleLevelZero(tex, coord) textureLod(tex, coord, 0.0) -out vec4 v_FragColor; - void main() { // Fetch the blending weights for current pixel. @@ -19,7 +22,6 @@ void main() a.x = texture(u_blendingWeightTex, v_offset.xy).a; // Right a.y = texture(u_blendingWeightTex, v_offset.zw).g; // Top a.wz = texture(u_blendingWeightTex, v_colorTexCoords).xz; // Bottom / Left - // Is there any blending weight with a value greater than 0.0? if (dot(a, vec4(1.0, 1.0, 1.0, 1.0)) < 1e-5) { @@ -36,11 +38,9 @@ void main() blendingWeight = a.xz; } blendingWeight /= dot(blendingWeight, vec2(1.0, 1.0)); - // Calculate the texture coordinates. vec4 bc = blendingOffset * vec4(u_framebufferMetrics.xy, -u_framebufferMetrics.xy); bc += v_colorTexCoords.xyxy; - // We exploit bilinear filtering to mix current pixel with the chosen neighbor. vec4 color = blendingWeight.x * SMAASampleLevelZero(u_colorTex, bc.xy); color += blendingWeight.y * SMAASampleLevelZero(u_colorTex, bc.zw); diff --git a/shaders/GL/smaa_final.vsh.glsl b/shaders/GL/smaa_final.vsh.glsl index 73dbd83c97..8a9752ac4b 100644 --- a/shaders/GL/smaa_final.vsh.glsl +++ b/shaders/GL/smaa_final.vsh.glsl @@ -1,12 +1,14 @@ // Implementation of Subpixel Morphological Antialiasing (SMAA) is based on https://github.com/iryoku/smaa +layout (location = 0) in vec2 a_pos; +layout (location = 1) in vec2 a_tcoord; -in vec2 a_pos; -in vec2 a_tcoord; +layout (location = 0) out vec2 v_colorTexCoords; +layout (location = 1) out vec4 v_offset; -uniform vec4 u_framebufferMetrics; - -out vec2 v_colorTexCoords; -out vec4 v_offset; +layout (binding = 0) uniform UBO +{ + vec4 u_framebufferMetrics; +}; void main() { diff --git a/shaders/GL/solid_color.fsh.glsl b/shaders/GL/solid_color.fsh.glsl index 4362d4ecb9..5b1f53ba5e 100644 --- a/shaders/GL/solid_color.fsh.glsl +++ b/shaders/GL/solid_color.fsh.glsl @@ -1,13 +1,23 @@ -uniform float u_opacity; - #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -uniform sampler2D u_colorTex; -in vec2 v_colorTexCoords; +layout (location = 1) in vec2 v_colorTexCoords; +layout (binding = 1) uniform sampler2D u_colorTex; #endif -out vec4 v_FragColor; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { @@ -19,4 +29,3 @@ void main() finalColor.a *= u_opacity; v_FragColor = finalColor; } - diff --git a/shaders/GL/text.fsh.glsl b/shaders/GL/text.fsh.glsl index 5e27e1c362..eb1e15bada 100644 --- a/shaders/GL/text.fsh.glsl +++ b/shaders/GL/text.fsh.glsl @@ -1,17 +1,26 @@ #ifdef ENABLE_VTF -in LOW_P vec4 v_color; +layout (location = 0) in LOW_P vec4 v_color; #else -in vec2 v_colorTexCoord; -uniform sampler2D u_colorTex; +layout (location = 1) in vec2 v_colorTexCoord; +layout (binding = 1) uniform sampler2D u_colorTex; #endif +layout (location = 2) in vec2 v_maskTexCoord; -in vec2 v_maskTexCoord; +layout (location = 0) out vec4 v_FragColor; -uniform sampler2D u_maskTex; -uniform float u_opacity; -uniform vec2 u_contrastGamma; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; -out vec4 v_FragColor; +layout (binding = 2) uniform sampler2D u_maskTex; void main() { diff --git a/shaders/GL/text.vsh.glsl b/shaders/GL/text.vsh.glsl index d3c5e10026..b2669589a7 100644 --- a/shaders/GL/text.vsh.glsl +++ b/shaders/GL/text.vsh.glsl @@ -1,27 +1,36 @@ -in vec2 a_colorTexCoord; -in vec2 a_maskTexCoord; -in vec4 a_position; -in vec2 a_normal; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) in vec2 a_colorTexCoord; +layout (location = 1) in vec2 a_maskTexCoord; +layout (location = 2) in vec4 a_position; +layout (location = 3) in vec2 a_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif +layout (location = 2) out vec2 v_maskTexCoord; -out vec2 v_maskTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; +#endif void main() { vec4 pos = vec4(a_position.xyz, 1) * u_modelView; vec4 shiftedPos = vec4(a_normal, 0.0, 0.0) + pos; gl_Position = applyPivotTransform(shiftedPos * u_projection, u_pivotTransform, 0.0); - #ifdef ENABLE_VTF v_color = texture(u_colorTex, a_colorTexCoord); #else diff --git a/shaders/GL/text_billboard.vsh.glsl b/shaders/GL/text_billboard.vsh.glsl index efadcb39cf..d11c440110 100644 --- a/shaders/GL/text_billboard.vsh.glsl +++ b/shaders/GL/text_billboard.vsh.glsl @@ -1,22 +1,28 @@ -in vec2 a_colorTexCoord; -in vec2 a_maskTexCoord; -in vec4 a_position; -in vec2 a_normal; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_isOutlinePass; -uniform float u_zScale; +layout (location = 0) in vec2 a_colorTexCoord; +layout (location = 1) in vec2 a_maskTexCoord; +layout (location = 2) in vec4 a_position; +layout (location = 3) in vec2 a_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif +layout (location = 2) out vec2 v_maskTexCoord; -out vec2 v_maskTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/text_outlined.vsh.glsl b/shaders/GL/text_outlined.vsh.glsl index 4fd1c82ac6..851f0e09f3 100644 --- a/shaders/GL/text_outlined.vsh.glsl +++ b/shaders/GL/text_outlined.vsh.glsl @@ -1,22 +1,31 @@ -in vec2 a_colorTexCoord; -in vec2 a_outlineColorTexCoord; -in vec2 a_maskTexCoord; -in vec4 a_position; -in vec2 a_normal; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_isOutlinePass; +layout (location = 0) in vec2 a_colorTexCoord; +layout (location = 1) in vec2 a_outlineColorTexCoord; +layout (location = 2) in vec2 a_maskTexCoord; +layout (location = 3) in vec4 a_position; +layout (location = 4) in vec2 a_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif +layout (location = 2) out vec2 v_maskTexCoord; -out vec2 v_maskTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; +#endif const float BaseDepthShift = -10.0; @@ -25,7 +34,6 @@ void main() float isOutline = step(0.5, u_isOutlinePass); float notOutline = 1.0 - isOutline; float depthShift = BaseDepthShift * isOutline; - vec4 pos = (vec4(a_position.xyz, 1) + vec4(0.0, 0.0, depthShift, 0.0)) * u_modelView; vec4 shiftedPos = vec4(a_normal, 0.0, 0.0) + pos; gl_Position = applyPivotTransform(shiftedPos * u_projection, u_pivotTransform, 0.0); diff --git a/shaders/GL/text_outlined_billboard.vsh.glsl b/shaders/GL/text_outlined_billboard.vsh.glsl index 2fd2ae501c..c7f1f6dbb2 100644 --- a/shaders/GL/text_outlined_billboard.vsh.glsl +++ b/shaders/GL/text_outlined_billboard.vsh.glsl @@ -1,23 +1,29 @@ -in vec2 a_colorTexCoord; -in vec2 a_outlineColorTexCoord; -in vec2 a_maskTexCoord; -in vec4 a_position; -in vec2 a_normal; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_isOutlinePass; -uniform float u_zScale; +layout (location = 0) in vec2 a_colorTexCoord; +layout (location = 1) in vec2 a_outlineColorTexCoord; +layout (location = 2) in vec2 a_maskTexCoord; +layout (location = 3) in vec4 a_position; +layout (location = 4) in vec2 a_normal; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif +layout (location = 2) out vec2 v_maskTexCoord; -out vec2 v_maskTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; const float kBaseDepthShift = -10.0; @@ -25,12 +31,10 @@ void main() { float isOutline = step(0.5, u_isOutlinePass); float depthShift = kBaseDepthShift * isOutline; - vec4 pivot = (vec4(a_position.xyz, 1.0) + vec4(0.0, 0.0, depthShift, 0.0)) * u_modelView; vec4 offset = vec4(a_normal, 0.0, 0.0) * u_projection; gl_Position = applyBillboardPivotTransform(pivot * u_projection, u_pivotTransform, a_position.w * u_zScale, offset.xy); - vec2 colorTexCoord = mix(a_colorTexCoord, a_outlineColorTexCoord, isOutline); #ifdef ENABLE_VTF v_color = texture(u_colorTex, colorTexCoord); diff --git a/shaders/GL/text_outlined_gui.fsh.glsl b/shaders/GL/text_outlined_gui.fsh.glsl new file mode 100644 index 0000000000..e5cd02a342 --- /dev/null +++ b/shaders/GL/text_outlined_gui.fsh.glsl @@ -0,0 +1,35 @@ +#ifdef ENABLE_VTF +layout (location = 0) in LOW_P vec4 v_color; +#else +layout (location = 1) in vec2 v_colorTexCoord; +layout (binding = 1) uniform sampler2D u_colorTex; +#endif +layout (location = 2) in vec2 v_maskTexCoord; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; + +layout (binding = 2) uniform sampler2D u_maskTex; + +void main() +{ +#ifdef ENABLE_VTF + LOW_P vec4 glyphColor = v_color; +#else + LOW_P vec4 glyphColor = texture(u_colorTex, v_colorTexCoord); +#endif + float dist = texture(u_maskTex, v_maskTexCoord).r; + float alpha = smoothstep(u_contrastGamma.x - u_contrastGamma.y, u_contrastGamma.x + u_contrastGamma.y, dist) * u_opacity; + glyphColor.a *= alpha; + v_FragColor = glyphColor; +} diff --git a/shaders/GL/text_outlined_gui.vsh.glsl b/shaders/GL/text_outlined_gui.vsh.glsl index 287ec2afd9..a242ba5d1b 100644 --- a/shaders/GL/text_outlined_gui.vsh.glsl +++ b/shaders/GL/text_outlined_gui.vsh.glsl @@ -1,21 +1,30 @@ -in vec3 a_position; -in vec2 a_colorTexCoord; -in vec2 a_outlineColorTexCoord; -in vec2 a_normal; -in vec2 a_maskTexCoord; - -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform float u_isOutlinePass; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_colorTexCoord; +layout (location = 2) in vec2 a_outlineColorTexCoord; +layout (location = 3) in vec2 a_normal; +layout (location = 4) in vec2 a_maskTexCoord; #ifdef ENABLE_VTF -uniform sampler2D u_colorTex; -out LOW_P vec4 v_color; +layout (location = 0) out LOW_P vec4 v_color; #else -out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_colorTexCoord; #endif +layout (location = 2) out vec2 v_maskTexCoord; -out vec2 v_maskTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; + +#ifdef ENABLE_VTF +layout (binding = 1) uniform sampler2D u_colorTex; +#endif const float kBaseDepthShift = -10.0; @@ -23,7 +32,6 @@ void main() { float isOutline = step(0.5, u_isOutlinePass); float depthShift = kBaseDepthShift * isOutline; - vec4 pos = (vec4(a_position, 1.0) + vec4(0.0, 0.0, depthShift, 0.0)) * u_modelView; vec4 shiftedPos = vec4(a_normal, 0.0, 0.0) + pos; gl_Position = shiftedPos * u_projection; diff --git a/shaders/GL/texturing.fsh.glsl b/shaders/GL/texturing.fsh.glsl index 720f28ad3d..d8a628df66 100644 --- a/shaders/GL/texturing.fsh.glsl +++ b/shaders/GL/texturing.fsh.glsl @@ -1,9 +1,20 @@ -uniform sampler2D u_colorTex; -uniform float u_opacity; +layout (location = 0) in vec2 v_colorTexCoords; -in vec2 v_colorTexCoords; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/texturing.vsh.glsl b/shaders/GL/texturing.vsh.glsl index 57b4353fbc..224778c7c2 100644 --- a/shaders/GL/texturing.vsh.glsl +++ b/shaders/GL/texturing.vsh.glsl @@ -1,12 +1,20 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoords; -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { diff --git a/shaders/GL/texturing3d.fsh.glsl b/shaders/GL/texturing3d.fsh.glsl index 8af084e705..22c6516cf3 100644 --- a/shaders/GL/texturing3d.fsh.glsl +++ b/shaders/GL/texturing3d.fsh.glsl @@ -1,10 +1,21 @@ -uniform sampler2D u_colorTex; -uniform float u_opacity; +layout (location = 0) in vec2 v_colorTexCoords; +layout (location = 1) in float v_intensity; -in vec2 v_colorTexCoords; -in float v_intensity; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/texturing_billboard.vsh.glsl b/shaders/GL/texturing_billboard.vsh.glsl index 76ba64f477..e68b97c8f2 100644 --- a/shaders/GL/texturing_billboard.vsh.glsl +++ b/shaders/GL/texturing_billboard.vsh.glsl @@ -1,13 +1,20 @@ -in vec4 a_position; -in vec2 a_normal; -in vec2 a_colorTexCoords; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec2 a_normal; +layout (location = 2) in vec2 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_zScale; +layout (location = 0) out vec2 v_colorTexCoords; -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { diff --git a/shaders/GL/texturing_gui.fsh.glsl b/shaders/GL/texturing_gui.fsh.glsl new file mode 100644 index 0000000000..667d16c4fa --- /dev/null +++ b/shaders/GL/texturing_gui.fsh.glsl @@ -0,0 +1,23 @@ +layout (location = 0) in vec2 v_colorTexCoords; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; + +void main() +{ + vec4 finalColor = texture(u_colorTex, v_colorTexCoords); + finalColor.a *= u_opacity; + v_FragColor = finalColor; +} diff --git a/shaders/GL/texturing_gui.vsh.glsl b/shaders/GL/texturing_gui.vsh.glsl index c945418a6f..74aac5d49d 100644 --- a/shaders/GL/texturing_gui.vsh.glsl +++ b/shaders/GL/texturing_gui.vsh.glsl @@ -1,10 +1,18 @@ -in vec2 a_position; -in vec2 a_colorTexCoords; +layout (location = 0) in vec2 a_position; +layout (location = 1) in vec2 a_colorTexCoords; -uniform mat4 u_modelView; -uniform mat4 u_projection; +layout (location = 0) out vec2 v_colorTexCoords; -out vec2 v_colorTexCoords; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + vec2 u_contrastGamma; + vec2 u_position; + float u_isOutlinePass; + float u_opacity; + float u_length; +}; void main() { diff --git a/shaders/GL/texturing_position.fsh.glsl b/shaders/GL/texturing_position.fsh.glsl new file mode 100644 index 0000000000..c5ad5a77e0 --- /dev/null +++ b/shaders/GL/texturing_position.fsh.glsl @@ -0,0 +1,25 @@ +layout (location = 0) in vec2 v_colorTexCoords; + +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_position; + vec2 u_lineParams; + float u_accuracy; + float u_zScale; + float u_opacity; + float u_azimut; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; + +void main() +{ + vec4 finalColor = texture(u_colorTex, v_colorTexCoords); + finalColor.a *= u_opacity; + v_FragColor = finalColor; +} diff --git a/shaders/GL/traffic.fsh.glsl b/shaders/GL/traffic.fsh.glsl index 98cb596ab6..9e631f075e 100644 --- a/shaders/GL/traffic.fsh.glsl +++ b/shaders/GL/traffic.fsh.glsl @@ -1,36 +1,41 @@ -in vec2 v_colorTexCoord; -in vec2 v_maskTexCoord; -in float v_halfLength; +layout (location = 0) in vec2 v_colorTexCoord; +layout (location = 1) in vec2 v_maskTexCoord; +layout (location = 2) in float v_halfLength; -uniform sampler2D u_colorTex; -uniform sampler2D u_maskTex; -uniform float u_opacity; -uniform float u_outline; +layout (location = 0) out vec4 v_FragColor; -uniform vec3 u_lightArrowColor; -uniform vec3 u_darkArrowColor; -uniform vec3 u_outlineColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; +layout (binding = 2) uniform sampler2D u_maskTex; const float kAntialiasingThreshold = 0.92; - const float kOutlineThreshold1 = 0.8; const float kOutlineThreshold2 = 0.5; - const float kMaskOpacity = 0.7; -out vec4 v_FragColor; - void main() { vec4 color = texture(u_colorTex, v_colorTexCoord); float alphaCode = color.a; vec4 mask = texture(u_maskTex, v_maskTexCoord); color.a = u_opacity * (1.0 - smoothstep(kAntialiasingThreshold, 1.0, abs(v_halfLength))); - color.rgb = mix(color.rgb, mask.rgb * mix(u_lightArrowColor, u_darkArrowColor, step(alphaCode, 0.6)), mask.a * kMaskOpacity); + color.rgb = mix(color.rgb, mask.rgb * mix(u_lightArrowColor.rgb, u_darkArrowColor.rgb, step(alphaCode, 0.6)), mask.a * kMaskOpacity); if (u_outline > 0.0) { - color.rgb = mix(color.rgb, u_outlineColor, step(kOutlineThreshold1, abs(v_halfLength))); - color.rgb = mix(color.rgb, u_outlineColor, smoothstep(kOutlineThreshold2, kOutlineThreshold1, abs(v_halfLength))); + color.rgb = mix(color.rgb, u_outlineColor.rgb, step(kOutlineThreshold1, abs(v_halfLength))); + color.rgb = mix(color.rgb, u_outlineColor.rgb, smoothstep(kOutlineThreshold2, kOutlineThreshold1, abs(v_halfLength))); } v_FragColor = color; } diff --git a/shaders/GL/traffic.vsh.glsl b/shaders/GL/traffic.vsh.glsl index 4a18002600..ae06dfdb4f 100644 --- a/shaders/GL/traffic.vsh.glsl +++ b/shaders/GL/traffic.vsh.glsl @@ -1,16 +1,23 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_colorTexCoord; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_colorTexCoord; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoord; +layout (location = 1) out vec2 v_maskTexCoord; +layout (location = 2) out float v_halfLength; -uniform vec4 u_trafficParams; - -out vec2 v_colorTexCoord; -out vec2 v_maskTexCoord; -out float v_halfLength; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; const float kArrowVSize = 0.25; @@ -26,7 +33,6 @@ void main() transformedAxisPos = calcLineTransformedAxisPos(transformedAxisPos, a_position.xy + norm, u_modelView, length(norm)); } - float uOffset = length(vec4(kShapeCoordScalar, 0, 0, 0) * u_modelView) * a_normal.w; v_colorTexCoord = a_colorTexCoord.xy; float v = mix(a_colorTexCoord.z, a_colorTexCoord.z + kArrowVSize, 0.5 * a_normal.z + 0.5); diff --git a/shaders/GL/traffic_circle.fsh.glsl b/shaders/GL/traffic_circle.fsh.glsl index d844718c79..42c952913c 100644 --- a/shaders/GL/traffic_circle.fsh.glsl +++ b/shaders/GL/traffic_circle.fsh.glsl @@ -1,17 +1,28 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -in vec2 v_colorTexCoord; -in vec3 v_radius; +layout (location = 0) in vec2 v_colorTexCoord; +layout (location = 1) in vec3 v_radius; -uniform sampler2D u_colorTex; -uniform float u_opacity; +layout (location = 0) out vec4 v_FragColor; + +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; const float kAntialiasingThreshold = 0.92; -out vec4 v_FragColor; - void main() { vec4 color = texture(u_colorTex, v_colorTexCoord); diff --git a/shaders/GL/traffic_circle.vsh.glsl b/shaders/GL/traffic_circle.vsh.glsl index 4a61e10b67..e0e022ffe7 100644 --- a/shaders/GL/traffic_circle.vsh.glsl +++ b/shaders/GL/traffic_circle.vsh.glsl @@ -1,16 +1,22 @@ -in vec4 a_position; -in vec4 a_normal; -in vec2 a_colorTexCoord; +layout (location = 0) in vec4 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec2 a_colorTexCoord; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoord; +layout (location = 1) out vec3 v_radius; -uniform vec3 u_lightArrowColor; // Here we store left sizes by road classes. -uniform vec3 u_darkArrowColor; // Here we store right sizes by road classes. - -out vec2 v_colorTexCoord; -out vec3 v_radius; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; void main() { @@ -28,7 +34,6 @@ void main() } // radius = (leftSize + rightSize) / 2 v_radius = vec3(a_normal.zw, 1.0) * 0.5 * (leftSize + rightSize); - vec2 finalPos = transformedAxisPos + v_radius.xy; v_colorTexCoord = a_colorTexCoord; vec4 pos = vec4(finalPos, a_position.z, 1.0) * u_projection; diff --git a/shaders/GL/traffic_line.fsh.glsl b/shaders/GL/traffic_line.fsh.glsl index d4635a9a1f..230dd72f1d 100644 --- a/shaders/GL/traffic_line.fsh.glsl +++ b/shaders/GL/traffic_line.fsh.glsl @@ -1,9 +1,21 @@ -uniform sampler2D u_colorTex; -uniform float u_opacity; +layout (location = 0) in vec2 v_colorTexCoord; -in vec2 v_colorTexCoord; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/traffic_line.vsh.glsl b/shaders/GL/traffic_line.vsh.glsl index f7eaea48d3..0b21a74b37 100644 --- a/shaders/GL/traffic_line.vsh.glsl +++ b/shaders/GL/traffic_line.vsh.glsl @@ -1,11 +1,20 @@ -in vec3 a_position; -in vec2 a_colorTexCoord; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec2 a_colorTexCoord; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec2 v_colorTexCoord; -out vec2 v_colorTexCoord; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_trafficParams; + vec4 u_outlineColor; + vec4 u_lightArrowColor; + vec4 u_darkArrowColor; + float u_outline; + float u_opacity; +}; void main() { diff --git a/shaders/GL/transit.fsh.glsl b/shaders/GL/transit.fsh.glsl index 987d64bc04..db534f2d45 100644 --- a/shaders/GL/transit.fsh.glsl +++ b/shaders/GL/transit.fsh.glsl @@ -1,6 +1,6 @@ -in vec4 v_color; +layout (location = 0) in vec4 v_color; -out vec4 v_FragColor; +layout (location = 0) out vec4 v_FragColor; void main() { diff --git a/shaders/GL/transit.vsh.glsl b/shaders/GL/transit.vsh.glsl index fa1bf58214..4765e91d8d 100644 --- a/shaders/GL/transit.vsh.glsl +++ b/shaders/GL/transit.vsh.glsl @@ -1,14 +1,18 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec4 v_color; -uniform float u_lineHalfWidth; - -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_params; + float u_lineHalfWidth; + float u_maxRadius; +}; void main() { diff --git a/shaders/GL/transit_circle.fsh.glsl b/shaders/GL/transit_circle.fsh.glsl index 72d58ba3c3..d173f68f72 100644 --- a/shaders/GL/transit_circle.fsh.glsl +++ b/shaders/GL/transit_circle.fsh.glsl @@ -1,18 +1,16 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -in vec3 v_radius; -in vec4 v_color; +layout (location = 0) in vec3 v_radius; +layout (location = 1) in vec4 v_color; + +layout (location = 0) out vec4 v_FragColor; const float aaPixelsCount = 2.5; -out vec4 v_FragColor; - void main() { vec4 finalColor = v_color; - float smallRadius = v_radius.z - aaPixelsCount; float stepValue = smoothstep(smallRadius * smallRadius, v_radius.z * v_radius.z, dot(v_radius.xy, v_radius.xy)); diff --git a/shaders/GL/transit_circle.vsh.glsl b/shaders/GL/transit_circle.vsh.glsl index f775986be9..6595d1c13c 100644 --- a/shaders/GL/transit_circle.vsh.glsl +++ b/shaders/GL/transit_circle.vsh.glsl @@ -1,16 +1,19 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec3 v_radius; +layout (location = 1) out vec4 v_color; -uniform float u_lineHalfWidth; -uniform float u_maxRadius; - -out vec3 v_radius; -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_params; + float u_lineHalfWidth; + float u_maxRadius; +}; void main() { diff --git a/shaders/GL/transit_marker.fsh.glsl b/shaders/GL/transit_marker.fsh.glsl index f1c9298f80..9a44781a11 100644 --- a/shaders/GL/transit_marker.fsh.glsl +++ b/shaders/GL/transit_marker.fsh.glsl @@ -1,7 +1,7 @@ -in vec4 v_offsets; -in vec4 v_color; +layout (location = 0) in vec4 v_offsets; +layout (location = 1) in vec4 v_color; -out vec4 v_FragColor; +layout (location = 0) out vec4 v_FragColor; void main() { @@ -9,11 +9,9 @@ void main() vec2 radius; radius.x = max(0.0, abs(v_offsets.x) - v_offsets.z); radius.y = max(0.0, abs(v_offsets.y) - v_offsets.w); - float maxRadius = 1.0; float aaRadius = 0.9; float stepValue = smoothstep(aaRadius * aaRadius, maxRadius * maxRadius, dot(radius.xy, radius.xy)); finalColor.a = finalColor.a * (1.0 - stepValue); - v_FragColor = finalColor; } diff --git a/shaders/GL/transit_marker.vsh.glsl b/shaders/GL/transit_marker.vsh.glsl index 9a3f860ee4..27a6c12c8e 100644 --- a/shaders/GL/transit_marker.vsh.glsl +++ b/shaders/GL/transit_marker.vsh.glsl @@ -1,15 +1,19 @@ -in vec3 a_position; -in vec4 a_normal; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec4 a_normal; +layout (location = 2) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; +layout (location = 0) out vec4 v_offsets; +layout (location = 1) out vec4 v_color; -uniform vec3 u_params; - -out vec4 v_offsets; -out vec4 v_color; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec4 u_params; + float u_lineHalfWidth; + float u_maxRadius; +}; void main() { diff --git a/shaders/GL/user_mark.fsh.glsl b/shaders/GL/user_mark.fsh.glsl index a1ccd6d48f..ef07a95de3 100644 --- a/shaders/GL/user_mark.fsh.glsl +++ b/shaders/GL/user_mark.fsh.glsl @@ -1,14 +1,24 @@ // Warning! Beware to use this shader. "discard" command may significally reduce performance. -// Unfortunately some CG algorithms cannot be implemented on OpenGL ES 2.0 without discarding -// fragments from depth buffer. +// Unfortunately some CG algorithms cannot be implemented without discarding fragments from depth buffer. -uniform sampler2D u_colorTex; -uniform float u_opacity; +layout (location = 0) in vec4 v_texCoords; +layout (location = 1) in vec4 v_maskColor; -in vec4 v_texCoords; -in vec4 v_maskColor; +layout (location = 0) out vec4 v_FragColor; -out vec4 v_FragColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; + +layout (binding = 1) uniform sampler2D u_colorTex; void main() { diff --git a/shaders/GL/user_mark.vsh.glsl b/shaders/GL/user_mark.vsh.glsl index 311df04816..d9e150e6c0 100644 --- a/shaders/GL/user_mark.vsh.glsl +++ b/shaders/GL/user_mark.vsh.glsl @@ -1,22 +1,28 @@ -in vec3 a_position; -in vec3 a_normalAndAnimateOrZ; -in vec4 a_texCoords; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normalAndAnimateOrZ; +layout (location = 2) in vec4 a_texCoords; +layout (location = 3) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_interpolation; +layout (location = 0) out vec4 v_texCoords; +layout (location = 1) out vec4 v_maskColor; -out vec4 v_texCoords; -out vec4 v_maskColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { vec2 normal = a_normalAndAnimateOrZ.xy; if (a_normalAndAnimateOrZ.z > 0.0) normal = u_interpolation * normal; - vec4 p = vec4(a_position, 1.0) * u_modelView; vec4 pos = vec4(normal, 0.0, 0.0) + p; vec4 projectedPivot = p * u_projection; diff --git a/shaders/GL/user_mark_billboard.vsh.glsl b/shaders/GL/user_mark_billboard.vsh.glsl index 746e811f0e..607ad08d2a 100644 --- a/shaders/GL/user_mark_billboard.vsh.glsl +++ b/shaders/GL/user_mark_billboard.vsh.glsl @@ -1,22 +1,28 @@ -in vec3 a_position; -in vec3 a_normalAndAnimateOrZ; -in vec4 a_texCoords; -in vec4 a_color; +layout (location = 0) in vec3 a_position; +layout (location = 1) in vec3 a_normalAndAnimateOrZ; +layout (location = 2) in vec4 a_texCoords; +layout (location = 3) in vec4 a_color; -uniform mat4 u_modelView; -uniform mat4 u_projection; -uniform mat4 u_pivotTransform; -uniform float u_interpolation; +layout (location = 0) out vec4 v_texCoords; +layout (location = 1) out vec4 v_maskColor; -out vec4 v_texCoords; -out vec4 v_maskColor; +layout (binding = 0) uniform UBO +{ + mat4 u_modelView; + mat4 u_projection; + mat4 u_pivotTransform; + vec2 u_contrastGamma; + float u_opacity; + float u_zScale; + float u_interpolation; + float u_isOutlinePass; +}; void main() { vec2 normal = a_normalAndAnimateOrZ.xy; if (a_normalAndAnimateOrZ.z > 0.0) normal = u_interpolation * normal; - vec4 pivot = vec4(a_position, 1.0) * u_modelView; vec4 offset = vec4(normal, 0.0, 0.0) * u_projection; vec4 projectedPivot = pivot * u_projection; diff --git a/shaders/Metal/map.metal b/shaders/Metal/map.metal index ec5698d697..7e7d27db6e 100644 --- a/shaders/Metal/map.metal +++ b/shaders/Metal/map.metal @@ -8,11 +8,11 @@ typedef struct float4x4 u_modelView; float4x4 u_projection; float4x4 u_pivotTransform; + packed_float2 u_contrastGamma; float u_opacity; float u_zScale; float u_interpolation; float u_isOutlinePass; - packed_float2 u_contrastGamma; } Uniforms_T; // Area/AreaOutline diff --git a/shaders/Metal/route.metal b/shaders/Metal/route.metal index 39e0a0f412..8d5681aa4b 100644 --- a/shaders/Metal/route.metal +++ b/shaders/Metal/route.metal @@ -12,13 +12,13 @@ typedef struct float4 u_color; float4 u_maskColor; float4 u_outlineColor; + float4 u_fakeColor; + float4 u_fakeOutlineColor; + packed_float2 u_fakeBorders; packed_float2 u_pattern; packed_float2 u_angleCosSin; float u_arrowHalfWidth; float u_opacity; - packed_float2 u_fakeBorders; - float4 u_fakeColor; - float4 u_fakeOutlineColor; } Uniforms_T; // Route/RouteDash diff --git a/shaders/Metal/shapes.metal b/shaders/Metal/shapes.metal index 322f58c62d..9b3cba892b 100644 --- a/shaders/Metal/shapes.metal +++ b/shaders/Metal/shapes.metal @@ -10,8 +10,9 @@ typedef struct float4x4 u_projection; float4x4 u_pivotTransform; packed_float3 u_position; - float u_accuracy; + float u_dummy1; packed_float2 u_lineParams; + float u_accuracy; float u_zScale; float u_opacity; float u_azimut; diff --git a/shaders/Metal/traffic.metal b/shaders/Metal/traffic.metal index 2196c154b2..0ce95d9986 100644 --- a/shaders/Metal/traffic.metal +++ b/shaders/Metal/traffic.metal @@ -10,10 +10,13 @@ typedef struct float4x4 u_pivotTransform; float4 u_trafficParams; packed_float3 u_outlineColor; - float u_outline; + float u_dummy1; // alignment packed_float3 u_lightArrowColor; - float u_opacity; + float u_dummy2; // alignment packed_float3 u_darkArrowColor; + float u_dummy3; // alignment + float u_outline; + float u_opacity; } Uniforms_T; // Traffic diff --git a/shaders/Metal/transit.metal b/shaders/Metal/transit.metal index 602be7f70a..c8c8f74b50 100644 --- a/shaders/Metal/transit.metal +++ b/shaders/Metal/transit.metal @@ -9,6 +9,7 @@ typedef struct float4x4 u_projection; float4x4 u_pivotTransform; packed_float3 u_params; + float u_dummy1; float u_lineHalfWidth; float u_maxRadius; } Uniforms_T; diff --git a/shaders/gl_program_params.cpp b/shaders/gl_program_params.cpp index cf372db3e6..e524908ba1 100644 --- a/shaders/gl_program_params.cpp +++ b/shaders/gl_program_params.cpp @@ -46,12 +46,12 @@ template class GLTypeWrapper; BIND_GL_TYPE(float, gl_const::GLFloatType) BIND_GL_TYPE(glsl::vec2, gl_const::GLFloatVec2) -BIND_GL_TYPE(glsl::vec3, gl_const::GLFloatVec3) +BIND_GL_TYPE(glsl::vec3, gl_const::GLFloatVec4) BIND_GL_TYPE(glsl::vec4, gl_const::GLFloatVec4) BIND_GL_TYPE(glsl::mat4, gl_const::GLFloatMat4) BIND_GL_TYPE(int, gl_const::GLIntType) BIND_GL_TYPE(glsl::ivec2, gl_const::GLIntVec2) -BIND_GL_TYPE(glsl::ivec3, gl_const::GLIntVec3) +BIND_GL_TYPE(glsl::ivec3, gl_const::GLIntVec4) BIND_GL_TYPE(glsl::ivec4, gl_const::GLIntVec4) class Parameter diff --git a/shaders/gl_shaders_preprocessor.py b/shaders/gl_shaders_preprocessor.py index 8e70730683..b81717bf63 100755 --- a/shaders/gl_shaders_preprocessor.py +++ b/shaders/gl_shaders_preprocessor.py @@ -11,6 +11,9 @@ HIGHP_SEARCH = "highp" VERTEX_SHADER_EXT = ".vsh.glsl" FRAG_SHADER_EXT = ".fsh.glsl" +UBO_KEY = "UBO" +UNIFORMS_KEY = "Uniforms" + SHADERS_LIB_COMMON_PATTERN = "// Common" SHADERS_LIB_VS_PATTERN = "// VS" SHADERS_LIB_FS_PATTERN = "// FS" @@ -125,7 +128,7 @@ def write_definition_file(defines_file, generation_dir): output_file.write("{\n") output_file.write("extern char const * GL3_SHADER_VERSION;\n") output_file.write("extern char const * GLES3_SHADER_VERSION;\n\n") - output_file.write("extern GLProgramInfo GetProgramInfo(dp::ApiVersion apiVersion, Program program);\n") + output_file.write("extern GLProgramInfo const & GetProgramInfo(dp::ApiVersion apiVersion, Program program);\n") output_file.write("} // namespace gpu\n") if not os.path.isfile(defines_file) or not filecmp.cmp(defines_file, defines_file_tmp, False): @@ -162,57 +165,143 @@ def get_shaders_lib_content(shader_file, shaders_library): return lib_content -def write_shader_line(output_file, line): +def write_shader_line(output_file, line, shader_file, binding_info): if line.lstrip().startswith("//") or line == '\n' or len(line) == 0: - return + return False if line.find(LOWP_SEARCH) >= 0: - print("Incorrect shader. Do not use lowp in shader, use LOW_P instead.") + print(f"Incorrect shader {shader_file}. Do not use lowp in shader, use LOW_P instead.") exit(2) if line.find(MEDIUMP_SEARCH) >= 0: - print("Incorrect shader. Do not use mediump in shader, use MEDIUM_P instead.") + print(f"Incorrect shader {shader_file}. Do not use mediump in shader, use MEDIUM_P instead.") exit(2) if line.find(HIGHP_SEARCH) >= 0: - print("Incorrect shader. Do not use highp in shader, use HIGH_P instead.") + print(f"Incorrect shader {shader_file}. Do not use highp in shader, use HIGH_P instead.") exit(2) output_line = line.rstrip() - output_file.write(" %s \\n\\\n" % output_line) + + # Extract and remove layout binding + binding_match = re.search(r"layout\s*\(\s*binding\s*=\s*(\d+)\s*\)", output_line) + if binding_match: + binding_index = int(binding_match.group(1)) + # Remove the matched layout part from the string + output_line = re.sub(r"layout\s*\(\s*binding\s*=\s*\d+\s*\)\s*", "", output_line) + else: + binding_index = None + + # Extract sampler name + sampler_match = re.search(r"sampler2D\s+(\w+)", output_line) + sampler_name = sampler_match.group(1) if sampler_match else None + + if binding_index is None and sampler_name is not None: + print(f"Incorrect shader {shader_file}. Sampler must have binding index") + exit(2) + + ubo_started = False + if line.find("uniform UBO") >= 0: + if binding_index is not None: + binding_info[shader_file].append({UBO_KEY: binding_index}) + ubo_started = True + else: + print(f"Incorrect shader {shader_file}. Uniform block must have binding index") + exit(2) + + if binding_index and sampler_name: + binding_info[shader_file].append({sampler_name: binding_index}) + + if not ubo_started: + output_file.write(" %s \\n\\\n" % output_line) + + return ubo_started -def write_shader_body(output_file, shader_file, shader_dir, shaders_library): +def find_by_name_in_list(lst, name): + return next((item[name] for item in lst if name in item), None) + + +def write_uniform_shader_line(output_file, line, shader_file, binding_info): + if line.lstrip().startswith("//") or line == '\n' or len(line) == 0: + return False + output_line = line.lstrip().rstrip() + if output_line.find("};") >= 0: + return True + if output_line.find("{") >= 0: + return False + if output_line.find(",") >= 0 or output_line.count("u_") > 1: + print(f"Incorrect shader {shader_file}. Only one uniform per line") + exit(2) + + find_by_name_in_list(binding_info[shader_file], UNIFORMS_KEY).append(output_line) + + output_file.write(" uniform %s \\n\\\n" % output_line) + return False + + +def write_shader_body(output_file, shader_file, shader_dir, shaders_library, binding_info): lib_content = get_shaders_lib_content(shader_file, shaders_library) + ubo_started = False for line in open(os.path.join(shader_dir, shader_file)): + if ubo_started: + if write_uniform_shader_line(output_file, line, shader_file, binding_info): + ubo_started = False + continue if line.lstrip().startswith("void main"): for lib_line in lib_content.splitlines(): - write_shader_line(output_file, lib_line) - write_shader_line(output_file, line) + write_shader_line(output_file, lib_line, shader_file, binding_info) + ubo_started = write_shader_line(output_file, line, shader_file, binding_info) + if ubo_started: + binding_info[shader_file].append({UNIFORMS_KEY: []}) + output_file.write("\";\n\n") -def write_shader(output_file, shader_file, shader_dir, shaders_library): +def write_shader(output_file, shader_file, shader_dir, shaders_library, binding_info): output_file.write("char const %s[] = \" \\\n" % format_shader_source_name(shader_file)) write_shader_gles_header(output_file) - write_shader_body(output_file, shader_file, shader_dir, shaders_library) + write_shader_body(output_file, shader_file, shader_dir, shaders_library, binding_info) -def write_gpu_programs_map(file, programs_def): +def write_gpu_programs_map(file, programs_def, binding_info): for program in programs_def.keys(): vertex_shader = programs_def[program][0] vertex_source_name = format_shader_source_name(vertex_shader) fragment_shader = programs_def[program][1] fragment_source_name = format_shader_source_name(fragment_shader) + + check_bindings(vertex_shader, fragment_shader, binding_info[vertex_shader], binding_info[fragment_shader]) file.write(" GLProgramInfo(\"%s\", \"%s\", %s, %s),\n" % ( vertex_source_name, fragment_source_name, vertex_source_name, fragment_source_name)) +def check_bindings(vs, fs, vs_bindings, fs_bindings): + dict1 = {k: v for d in vs_bindings for k, v in d.items()} + dict2 = {k: v for d in fs_bindings for k, v in d.items()} + if UBO_KEY in dict1 and UBO_KEY in dict2: + if dict1[UBO_KEY] != dict2[UBO_KEY]: + print(f"Shaders {vs} and {fs} must use the same binding indexes for the UBO. VS:{dict1[UBO_KEY]}, FS:{dict2[UBO_KEY]}") + exit(2) + if UNIFORMS_KEY in dict1 and UNIFORMS_KEY in dict2: + if dict1[UNIFORMS_KEY] != dict2[UNIFORMS_KEY]: + print(f"Shaders {vs} and {fs} must use the same unforms inside the UBO. VS:{dict1[UNIFORMS_KEY]}, FS:{dict2[UNIFORMS_KEY]}") + exit(2) + common_keys = dict1.keys() & dict2.keys() + for key in common_keys: + if key == UBO_KEY or key == UNIFORMS_KEY: + continue + if dict1[key] != dict2[key]: + print(f"Shaders {vs} and {fs} must use the same binding indexes for textures. VS:{dict1[key]}, FS:{dict2[key]}") + exit(2) + + def write_implementation_file(programs_def, shader_index, shader_dir, impl_file, def_file, generation_dir, shaders_library): impl_file = os.path.join(generation_dir, impl_file) # Write to temporary file first, and then compare if its content has changed to avoid unnecessary code rebuilds. impl_file_tmp = impl_file + ".tmp" + binding_info = dict() with open(impl_file_tmp, 'w') as file: file.write("#include \"shaders/%s\"\n\n" % (def_file)) file.write("#include \"base/assert.hpp\"\n\n") @@ -221,22 +310,23 @@ def write_implementation_file(programs_def, shader_index, shader_dir, impl_file, file.write("namespace gpu\n") file.write("{\n") - file.write("char const * GL3_SHADER_VERSION = \"#version 150 core \\n\";\n") + file.write("char const * GL3_SHADER_VERSION = \"#version 410 core \\n\";\n") file.write("char const * GLES3_SHADER_VERSION = \"#version 300 es \\n\";\n\n") for shader in shader_index.keys(): - write_shader(file, shader, shader_dir, shaders_library) + binding_info[shader] = [] + write_shader(file, shader, shader_dir, shaders_library, binding_info) - file.write("GLProgramInfo GetProgramInfo(dp::ApiVersion apiVersion, Program program)\n") + file.write("GLProgramInfo const & GetProgramInfo(dp::ApiVersion apiVersion, Program program)\n") file.write("{\n") file.write(" CHECK_EQUAL(apiVersion, dp::ApiVersion::OpenGLES3, ());\n") file.write(" static std::array(Program::ProgramsCount)> gpuIndex = {{\n") - write_gpu_programs_map(file, programs_def) + write_gpu_programs_map(file, programs_def, binding_info) file.write(" }};\n") file.write(" return gpuIndex[static_cast(program)];\n") file.write("}\n") file.write("} // namespace gpu\n") - + if not os.path.isfile(impl_file) or not filecmp.cmp(impl_file, impl_file_tmp, False): os.replace(impl_file_tmp, impl_file) print(impl_file + " was replaced") @@ -260,13 +350,13 @@ if __name__ == '__main__': shaders = [file for file in os.listdir(shader_dir) if os.path.isfile(os.path.join(shader_dir, file)) and ( file.endswith(VERTEX_SHADER_EXT) or file.endswith(FRAG_SHADER_EXT))] - shaderIndex = generate_shader_indexes(shaders) + shader_index = generate_shader_indexes(shaders) programs_order = read_programs_file(os.path.join(shader_dir, '..', programs_file_name)) - programDefinition = read_index_file(os.path.join(shader_dir, index_file_name), programs_order) + program_definition = read_index_file(os.path.join(shader_dir, index_file_name), programs_order) shaders_library = read_shaders_lib_file(os.path.join(shader_dir, shaders_lib_file)) write_definition_file(defines_file, generation_dir) - write_implementation_file(programDefinition, shaderIndex, shader_dir, impl_file, defines_file, generation_dir, + write_implementation_file(program_definition, shader_index, shader_dir, impl_file, defines_file, generation_dir, shaders_library) diff --git a/shaders/program_params.hpp b/shaders/program_params.hpp index fa17305b74..f8ffa5d438 100644 --- a/shaders/program_params.hpp +++ b/shaders/program_params.hpp @@ -48,17 +48,22 @@ private: #define ALIGNMENT alignas(16) +// NOTE: structs may contain dummy elements to fit MSL and GLSL struct alignment rules +// 1. Add new fields in order from the highest byte size to the lowest, it minimizes alignment overhead +// 2. Keep 16 bytes alignment for the whole struct, it complements the size of the latest element to vec4 +// 3. Consider vec3 as vec4, add float complement and don't reuse it + struct ALIGNMENT MapProgramParams { glsl::mat4 m_modelView; glsl::mat4 m_projection; glsl::mat4 m_pivotTransform; + glsl::vec2 m_contrastGamma; float m_opacity = 1.0f; float m_zScale = 1.0f; float m_interpolation = 1.0f; float m_isOutlinePass = 1.0f; - glsl::vec2 m_contrastGamma; - + BIND_PROGRAMS(MapProgramParams, Program::Area, Program::Area3d, @@ -100,14 +105,14 @@ struct ALIGNMENT RouteProgramParams glsl::vec4 m_color; glsl::vec4 m_maskColor; glsl::vec4 m_outlineColor; + glsl::vec4 m_fakeColor; + glsl::vec4 m_fakeOutlineColor; + glsl::vec2 m_fakeBorders; glsl::vec2 m_pattern; glsl::vec2 m_angleCosSin; float m_arrowHalfWidth = 0.0f; float m_opacity = 1.0f; - glsl::vec2 m_fakeBorders; - glsl::vec4 m_fakeColor; - glsl::vec4 m_fakeOutlineColor; - + BIND_PROGRAMS(RouteProgramParams, Program::Route, Program::RouteDash, @@ -122,10 +127,13 @@ struct ALIGNMENT TrafficProgramParams glsl::mat4 m_pivotTransform; glsl::vec4 m_trafficParams; glsl::vec3 m_outlineColor; - float m_outline = 0.0f; + float m_dummy1; // alignment glsl::vec3 m_lightArrowColor; - float m_opacity = 1.0f; + float m_dummy2; // alignment glsl::vec3 m_darkArrowColor; + float m_dummy3; // alignment + float m_outline = 0.0f; + float m_opacity = 1.0f; BIND_PROGRAMS(TrafficProgramParams, Program::Traffic, @@ -139,6 +147,7 @@ struct ALIGNMENT TransitProgramParams glsl::mat4 m_projection; glsl::mat4 m_pivotTransform; glsl::vec3 m_params; + float m_dummy1; // alignment float m_lineHalfWidth = 0.0f; float m_maxRadius = 0.0f; @@ -171,8 +180,9 @@ struct ALIGNMENT ShapesProgramParams glsl::mat4 m_projection; glsl::mat4 m_pivotTransform; glsl::vec3 m_position; - float m_accuracy = 0.0; + float m_dummy1; // alignment glsl::vec2 m_lineParams; + float m_accuracy = 0.0; float m_zScale = 1.0f; float m_opacity = 1.0f; float m_azimut = 0.0; diff --git a/shaders/vulkan_shaders_preprocessor.py b/shaders/vulkan_shaders_preprocessor.py index 5c4e164d0a..aff77e02b3 100644 --- a/shaders/vulkan_shaders_preprocessor.py +++ b/shaders/vulkan_shaders_preprocessor.py @@ -16,8 +16,6 @@ SHADERS_LIB_COMMON_INDEX = 0 SHADERS_LIB_VS_INDEX = 1 SHADERS_LIB_FS_INDEX = 2 -IN = 'in' -OUT = 'out' UNIFORMS = 'uniforms' SAMPLERS = 'samplers' @@ -25,7 +23,7 @@ debug_output = False # Read index file which contains program to shaders bindings. -def read_index_file(file_path, programs_order): +def read_index_file(file_path): gpu_programs = dict() with open(file_path, 'r') as f: index = 0 @@ -35,10 +33,6 @@ def read_index_file(file_path, programs_order): print('Incorrect GPU program definition : ' + line) exit(1) - if line_parts[0] != programs_order[index]: - print('Incorrect GPU program order or name : ' + line) - exit(1) - vertex_shader = next(f for f in line_parts if f.endswith(VERTEX_SHADER_EXT)) fragment_shader = next(f for f in line_parts if f.endswith(FRAG_SHADER_EXT)) @@ -64,76 +58,6 @@ def read_index_file(file_path, programs_order): return gpu_programs_cache -# Read hpp-file with programs enumeration. -def read_programs_file(file_path): - gpu_programs = [] - with open(file_path, 'r') as f: - found = False - for line in f: - if not found and line.find('enum class Program') >= 0: - found = True - continue - if found and line.find('}') >= 0: - break - if found and line.find('{') == -1: - line_parts = re.split(',|=', line) - name = line_parts[0].strip() - if name and name != 'ProgramsCount': - gpu_programs.append(name) - return gpu_programs - - -def drop_variable_initialization(line): - equal_found = line.find('=') - if equal_found: - return line[:equal_found - 1] - return line.replace(';', '') - - -def get_program_param(line): - glsl_found = line.find('glsl::') - if glsl_found >= 0: - return drop_variable_initialization(line[glsl_found + 6:].replace('m_', 'u_')) - if line.find('float ') >= 0 or line.find('int ') >= 0: - return drop_variable_initialization(line.lstrip().replace('m_', 'u_')) - return None - - -def get_program(line): - program_found = line.find('Program::') - if program_found >= 0: - return line[program_found + 9:].replace(',', '').replace(')', '').replace('\n', '') - return None - - -# Read hpp-file with program parameters declaration. -def read_program_params_file(file_path): - program_params = [] - programs = [] - result = dict() - with open(file_path, 'r') as f: - block_found = False - for line in f: - if line.find('struct') >= 0 and line.find('ProgramParams') >= 0: - block_found = True - program_params = [] - programs = [] - continue - if block_found and line.find('}') >= 0: - block_found = False - for p in programs: - result[p] = program_params - continue - if block_found: - param = get_program_param(line) - if param: - program_params.append(param.split(' ')) - program = get_program(line) - if program: - programs.append(program) - return result - - # Read GLSL-file with common shader functions. def read_shaders_lib_file(file_path): shaders_library = ['', '', ''] @@ -174,112 +98,43 @@ def get_shaders_lib_content(shader_file, shaders_library): return lib_content -def get_shader_line(line, layout_counters, is_fragment_shader): +def get_shader_line(line, layout_counters): if line.lstrip().startswith('//') or line == '\n' or len(line) == 0: return None output_line = line.rstrip() - if output_line.find('uniform ') >= 0: + if output_line.find('layout (binding') >= 0: if output_line.find('sampler') >= 0: - layout_counters[SAMPLERS][1].append(output_line) + match = re.search(r"binding\s*=\s*(\d+)", output_line) + sampler_match = re.search(r"sampler2D\s+(\w+)", output_line) + if match and sampler_match: + binding_index = int(match.group(1)) + sampler_name = sampler_match.group(1) + if binding_index == 0: + print('Binding index must not be 0 for sampler in the line: ' + line) + exit(1) + layout_counters[SAMPLERS][sampler_name] = binding_index + else: + print('Sampler name or binding index is not found in the line: ' + line) + exit(1) else: + match = re.search(r"binding\s*=\s*(\d+)", output_line) + if match: + binding_index = int(match.group(1)) + if binding_index != 0: + print('Binding index must be 0 in the line: ' + line) + exit(1) + else: + print('Binding index is not found in the line: ' + line) + exit(1) layout_counters[UNIFORMS] += 1 - return None - if output_line.find('attribute ') >= 0: - location = layout_counters[IN] - layout_counters[IN] += 1 - output_line = output_line.replace('attribute', 'layout (location = {0}) in'.format(location)) - - if output_line.find('varying ') >= 0: - if is_fragment_shader: - location = layout_counters[IN] - layout_counters[IN] += 1 - output_line = output_line.replace('varying', 'layout (location = {0}) in'.format(location)) - else: - location = layout_counters[OUT] - layout_counters[OUT] += 1 - output_line = output_line.replace('varying', 'layout (location = {0}) out'.format(location)) - output_line = output_line.replace('texture2D', 'texture') - output_line = output_line.replace('gl_FragColor', 'v_FragColor') return output_line -def get_size_by_type(type): - if type == 'float' or type == 'int': - return 1 - if type == 'vec2': - return 2 - if type == 'vec3': - return 3 - if type == 'vec4': - return 4 - if type == 'mat4': - return 16 - print('Type is not supported' + type) - exit(1) - - -def get_subscript(offset, param): - symbols = ['x', 'y', 'z', 'w'] - subscript = '' - for i in range(0, get_size_by_type(param[0])): - subscript += symbols[offset + i] - return subscript - - -def write_uniform_block(output_file, program_params): - groups = [] - c = 0 - group_index = 0 - group_params = [] - for p in program_params: - sz = get_size_by_type(p[0]) - if sz % 4 == 0: - groups.append((p[0], p[1], [p])) - else: - if c + sz < 4: - group_params.append(p) - c += sz - elif c + sz == 4: - group_params.append(p) - groups.append(('vec4', 'u_grouped{0}'.format(group_index), group_params)) - group_index += 1 - group_params = [] - c = 0 - else: - print('Must be possible to unite sequential variables to vec4') - exit(1) - if c != 0: - groups.append(('vec4', 'u_grouped{0}'.format(group_index), group_params)) - - output_file.write('layout (binding = 0) uniform UBO\n') - output_file.write('{\n') - for g in groups: - output_file.write(' {0} {1};\n'.format(g[0], g[1])) - output_file.write('} uniforms;\n') - for k in groups: - name = k[1] - params = k[2] - offset = 0 - if len(params) == 1 and get_size_by_type(params[0][0]) % 4 == 0: - output_file.write('#define {0} uniforms.{1}\n'.format(params[0][1], name)) - continue - for param in params: - output_file.write('#define {0} uniforms.{1}.{2}\n'.format(param[1], name, get_subscript(offset, param))) - offset += get_size_by_type(param[0]) - - -def get_size_of_attributes_block(lines_before_main): - for i, line in reversed(list(enumerate(lines_before_main))): - if line.find('layout (location') >= 0: - return i + 1 - return len(lines_before_main) - - def generate_spirv_compatible_glsl_shader(output_file, shader_file, shader_dir, shaders_library, - program_params, layout_counters, reflection_dict): + layout_counters, reflection_dict): output_file.write('#version 310 es\n') output_file.write('precision highp float;\n') output_file.write('#define LOW_P lowp\n') @@ -290,8 +145,6 @@ def generate_spirv_compatible_glsl_shader(output_file, shader_file, shader_dir, lib_content = get_shaders_lib_content(shader_file, shaders_library) conditional_started = False conditional_skip = False - lines_before_main = [] - main_found = False for line in open(os.path.join(shader_dir, shader_file)): # Remove some useless conditional compilation. if conditional_started and line.lstrip().startswith('#else'): @@ -303,67 +156,40 @@ def generate_spirv_compatible_glsl_shader(output_file, shader_file, shader_dir, continue if conditional_skip: continue - if line.lstrip().startswith('#ifdef ENABLE_VTF') or line.lstrip().startswith('#ifdef GLES3'): + if line.lstrip().startswith('#ifdef ENABLE_VTF'): conditional_started = True continue if line.lstrip().startswith('void main'): - main_found = True - - # Write attributes. - sz = get_size_of_attributes_block(lines_before_main) - for i in range(0, sz): - output_file.write('%s\n' % lines_before_main[i]) - - if is_fragment_shader: - output_file.write('layout (location = 0) out vec4 v_FragColor;\n') - - # Write uniforms block. + # Write reflection for uniforms block. uniforms_index = 'vs_uni'; if is_fragment_shader: uniforms_index = 'fs_uni' if layout_counters[UNIFORMS] > 0: - write_uniform_block(output_file, program_params) reflection_dict[uniforms_index] = 0 else: reflection_dict[uniforms_index] = -1 - # Write samplers. + # Write reflection for samplers. sample_index = 'tex' - samplers_offset = layout_counters[SAMPLERS][0] - if layout_counters[UNIFORMS] > 0 and samplers_offset == 0: - samplers_offset = 1 - for idx, s in enumerate(layout_counters[SAMPLERS][1]): - output_file.write('layout (binding = {0}) {1}\n'.format(samplers_offset + idx, s)) - sampler = {'name': s[s.find('u_'):-1], 'idx': samplers_offset + idx, 'frag':int(is_fragment_shader)} - if not sample_index in reflection_dict: - reflection_dict[sample_index] = [sampler] - else: - reflection_dict[sample_index].append(sampler) - layout_counters[SAMPLERS][0] = samplers_offset + len(layout_counters[SAMPLERS][1]) - layout_counters[SAMPLERS][1] = [] + if not sample_index in reflection_dict: + reflection_dict[sample_index] = [] + for (s, idx) in layout_counters[SAMPLERS].items(): + sampler = {'name': s, 'idx': idx, 'frag':int(is_fragment_shader)} + reflection_dict[sample_index].append(sampler) # Write shaders library. for lib_line in lib_content.splitlines(): - shader_line = get_shader_line(lib_line, layout_counters, is_fragment_shader) + shader_line = get_shader_line(lib_line, layout_counters) if shader_line: output_file.write('%s\n' % shader_line) - # Write rest lines. - for i in range(sz, len(lines_before_main)): - output_file.write('%s\n' % lines_before_main[i]) - - shader_line = get_shader_line(line, layout_counters, is_fragment_shader) - if not shader_line: - continue - - if main_found: + shader_line = get_shader_line(line, layout_counters) + if shader_line: output_file.write('%s\n' % shader_line) - else: - lines_before_main.append(shader_line) - layout_counters[IN] = 0 - layout_counters[OUT] = 0 + layout_counters[UNIFORMS] = 0 + layout_counters[SAMPLERS] = dict() # Execute external program. @@ -377,12 +203,12 @@ def execute_external(options): # Generate SPIR-V shader from GLSL source. -def generate_shader(shader, shader_dir, generation_dir, shaders_library, program_name, program_params, +def generate_shader(shader, shader_dir, generation_dir, shaders_library, program_name, layout_counters, output_name, reflection_dict, glslc_path): output_path = os.path.join(generation_dir, output_name) with open(output_path, 'w') as file: generate_spirv_compatible_glsl_shader(file, shader, shader_dir, shaders_library, - program_params, layout_counters, reflection_dict) + layout_counters, reflection_dict) spv_path = output_path + '.spv' try: execute_external([glslc_path, '-c', output_path, '-o', spv_path, '-std=310es', '--target-env=vulkan']) @@ -402,21 +228,6 @@ def generate_shader(shader, shader_dir, generation_dir, shaders_library, program return spv_path -# Check if varying are in the same order in vertex and fragment shaders. -def check_varying_consistency(vs_file_name, fs_file_name): - vs_varyings = [] - for line in open(vs_file_name): - line = line.lstrip().rstrip() - if line.startswith('varying '): - vs_varyings.append(line) - fs_varyings = [] - for line in open(fs_file_name): - line = line.lstrip().rstrip() - if line.startswith('varying '): - fs_varyings.append(line) - return vs_varyings == fs_varyings - - def write_shader_to_pack(pack_file, shader_file_name): offset = pack_file.tell() with open(shader_file_name, 'rb') as shader_file: @@ -427,48 +238,38 @@ def write_shader_to_pack(pack_file, shader_file_name): if __name__ == '__main__': if len(sys.argv) < 7: - print('Usage : ' + sys.argv[0] + ' [--debug]') + print('Usage : ' + sys.argv[0] + ' [--debug]') exit(1) shader_dir = sys.argv[1] index_file_name = sys.argv[2] - programs_file_name = sys.argv[3] - program_params_file_name = sys.argv[4] - shaders_lib_file = sys.argv[5] - generation_dir = sys.argv[6] - glslc_path = sys.argv[7] + shaders_lib_file = sys.argv[3] + generation_dir = sys.argv[4] + glslc_path = sys.argv[5] - if len(sys.argv) >= 9: - debug_output = (sys.argv[8] == '--debug') + if len(sys.argv) >= 7: + debug_output = (sys.argv[6] == '--debug') shaders = [file for file in os.listdir(shader_dir) if os.path.isfile(os.path.join(shader_dir, file)) and ( file.endswith(VERTEX_SHADER_EXT) or file.endswith(FRAG_SHADER_EXT))] - programs_order = read_programs_file(os.path.join(shader_dir, '..', programs_file_name)) - program_params = read_program_params_file(os.path.join(shader_dir, '..', program_params_file_name)) - gpu_programs_cache = read_index_file(os.path.join(shader_dir, index_file_name), programs_order) + gpu_programs_cache = read_index_file(os.path.join(shader_dir, index_file_name)) shaders_library = read_shaders_lib_file(os.path.join(shader_dir, shaders_lib_file)) reflection = [] current_offset = 0 with open(os.path.join(generation_dir, 'shaders_pack.spv'), 'wb') as pack_file: for (k, v) in gpu_programs_cache.items(): - if not k in program_params: - print('Program params were not found for the shader ' + k) - exit(1) - if not check_varying_consistency(os.path.join(shader_dir, v[0]), os.path.join(shader_dir, v[1])): - print('Varyings must be in the same order in VS and FS. Shaders: {0}, {1} / Program: {2}.'.format(v[0], v[1], k)) - exit(1) - layout_counters = {IN: 0, OUT: 0, UNIFORMS: 0, SAMPLERS: [0, list()]} + layout_counters = {UNIFORMS: 0, SAMPLERS: dict()} reflection_dict = {'prg': v[2], 'info': dict()} vs_offset = write_shader_to_pack(pack_file, generate_shader(v[0], shader_dir, generation_dir, - shaders_library, k, program_params[k], + shaders_library, k, layout_counters, k + VERTEX_SHADER_EXT_OUT, reflection_dict['info'], glslc_path)) reflection_dict['vs_off'] = vs_offset[0] reflection_dict['vs_size'] = vs_offset[1] fs_offset = write_shader_to_pack(pack_file, generate_shader(v[1], shader_dir, generation_dir, - shaders_library, k, program_params[k], + shaders_library, k, layout_counters, k + FRAG_SHADER_EXT_OUT, reflection_dict['info'], glslc_path)) reflection_dict['fs_off'] = fs_offset[0] diff --git a/tools/unix/generate_vulkan_shaders.sh b/tools/unix/generate_vulkan_shaders.sh index 1db5795797..e4f05849ca 100755 --- a/tools/unix/generate_vulkan_shaders.sh +++ b/tools/unix/generate_vulkan_shaders.sh @@ -29,4 +29,4 @@ fi OMIM_PATH="${OMIM_PATH:-$(cd "$(dirname "$0")/../.."; pwd)}" SHADERS_GENERATOR="$OMIM_PATH/shaders/vulkan_shaders_preprocessor.py" -python3 "$SHADERS_GENERATOR" "$OMIM_PATH/shaders/GL" shader_index.txt programs.hpp program_params.hpp shaders_lib.glsl "$OMIM_PATH/data/vulkan_shaders" "$GLSLC_PATH" "$DEBUG" \ No newline at end of file +python3 "$SHADERS_GENERATOR" "$OMIM_PATH/shaders/GL" shader_index.txt shaders_lib.glsl "$OMIM_PATH/data/vulkan_shaders" "$GLSLC_PATH" "$DEBUG" \ No newline at end of file