### Godot version

4.0 beta 10

### System information

Windows 10, Vulkan Renderer

### Issue description

In 2D scenes with sprites, when the sprite's `flip_h` and/or `flip_v` property is enabled, the normal map is flipped with the image, causing lighting to be reversed. While this does technically make sense, in a game where You have a bunch of sprites that flip and use normal maps, the only solution is to generate normal maps for both facing directions.
![image](https://user-images.githubusercontent.com/47702559/209426338-6257d66c-a965-4793-a7bb-5a635a136267.png)

Ultimately the fix is simple: Invert the red channel in normal maps on horizontally flipped sprites, and invert the green channel on vertically flipped sprites.

### Steps to reproduce

1) Create a Sprite2D
2) Add a Diffuse Texture and Normal Map 
3) Add a 2D Light to the scene
4) Enable `flip_h` and/or `flip_v` on the Sprite2D

### Minimal reproduction project

[Normal not flipped.zip](https://github.com/godotengine/godot/files/10298203/Normal.not.flipped.zip)

RID sdf_texture = texture_storage->render_target_get_sdf_texture(p_render_target);
						Rect2 to_screen;
						{
							Rect2 sdf_rect = texture_storage->render_target_get_sdf_rect(p_render_target);
							to_screen.size = Vector2(1.0 / sdf_rect.size.width, 1.0 / sdf_rect.size.height);
							to_screen.position = -sdf_rect.position * to_screen.size;
						}
						particles_storage->particles_set_canvas_sdf_collision(pt->particles, true, xform, to_screen, sdf_texture);
					} else {
						particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), RID());
					}
					
					r_sdf_used |= particles_storage->particles_has_collision(pt->particles);
				}
				if (mesh.is_null()) {
					break;
				}
				_bind_canvas_texture(p_draw_list, texture, current_filter, current_repeat, last_texture, push_constant, texpixel_size);
				uint32_t surf_count = mesh_storage->mesh_get_surface_count(mesh);
				static const PipelineVariant variant[RS::PRIMITIVE_MAX] = { PIPELINE_VARIANT_ATTRIBUTE_POINTS, PIPELINE_VARIANT_ATTRIBUTE_LINES, PIPELINE_VARIANT_ATTRIBUTE_LINES_STRIP, PIPELINE_VARIANT_ATTRIBUTE_TRIANGLES, PIPELINE_VARIANT_ATTRIBUTE_TRIANGLE_STRIP };
				push_constant.modulation[0] = base_color.r * modulate.r;
				push_constant.modulation[1] = base_color.g * modulate.g;
				push_constant.modulation[2] = base_color.b * modulate.b;
				push_constant.modulation[3] = base_color.a * modulate.a;
				for (int j = 0; j < 4; j++) {
					push_constant.src_rect[j] = 0;
					push_constant.dst_rect[j] = 0;
					push_constant.ninepatch_margins[j] = 0;
				}
				for (uint32_t j = 0; j < surf_count; j++) {