### 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)

bool instance_uses_color = false;
			bool instance_uses_custom_data = false;
			if (state.canvas_instance_batches[p_index].command_type == Item::Command::TYPE_MESH) {
				const Item::CommandMesh *m = static_cast<const Item::CommandMesh *>(state.canvas_instance_batches[p_index].command);
				mesh = m->mesh;
				mesh_instance = m->mesh_instance;
			} else if (state.canvas_instance_batches[p_index].command_type == Item::Command::TYPE_MULTIMESH) {
				const Item::CommandMultiMesh *mm = static_cast<const Item::CommandMultiMesh *>(state.canvas_instance_batches[p_index].command);
				RID multimesh = mm->multimesh;
				mesh = mesh_storage->multimesh_get_mesh(multimesh);
				if (mesh_storage->multimesh_get_transform_format(multimesh) != RS::MULTIMESH_TRANSFORM_2D) {
					break;
				}
				instance_count = mesh_storage->multimesh_get_instances_to_draw(multimesh);
				if (instance_count == 0) {
					break;
				}
				instance_buffer = mesh_storage->multimesh_get_gl_buffer(multimesh);
				instance_stride = mesh_storage->multimesh_get_stride(multimesh);
				instance_color_offset = mesh_storage->multimesh_get_color_offset(multimesh);
				instance_uses_color = mesh_storage->multimesh_uses_colors(multimesh);
				instance_uses_custom_data = mesh_storage->multimesh_uses_custom_data(multimesh);
			} else if (state.canvas_instance_batches[p_index].command_type == Item::Command::TYPE_PARTICLES) {
				const Item::CommandParticles *pt = static_cast<const Item::CommandParticles *>(state.canvas_instance_batches[p_index].command);
				RID particles = pt->particles;
				mesh = particles_storage->particles_get_draw_pass_mesh(particles, 0);
				ERR_BREAK(particles_storage->particles_get_mode(particles) != RS::PARTICLES_MODE_2D);
				particles_storage->particles_request_process(particles);
				if (particles_storage->particles_is_inactive(particles)) {
					break;