### Godot version

v4.0.beta.custom_build [2afa17519]

### System information

Windows 10, Forward+, NVIDIA GeForce GTX 1050 Ti (31.0.15.1694)

### Issue description

Attempting to tile multiple noise textures with the same settings will create visible seams between them.

Image of 4 noise textures creating seams between them
![noise_seam](https://user-images.githubusercontent.com/10490534/215283424-5dcd06ca-32be-4bf1-827d-654e3f640e8e.png)

It seems to be due to the values being normalized, as can be seen here:
https://github.com/godotengine/godot/blob/218bef90af2091afde3b1be816c87286c194a2a8/modules/noise/noise.cpp#L87

It would be nice if this could be an option instead of hard coded into the noise texture.

### Steps to reproduce

- Create two Sprite2D
- Give them a noise texture
- Make sure both the texture and the noise object of the two sprites are unique
- Reposition the sprites so their edges connect
- Set the noise offsets to the sprite's position
- Observe the textures seemingly tile well with the exception of a visible seam

### Minimal reproduction project

This test project uses a \@tool script for the `noise` scene to duplicate the texture and noise object on `_ready`.
Reopen the `main` scene to refresh textures.
[noise_seam.zip](https://github.com/godotengine/godot/files/10527941/noise_seam.zip)
ClassDB::bind_method(D_METHOD("get_bump_strength"), &NoiseTexture2D::get_bump_strength);
	ClassDB::bind_method(D_METHOD("set_color_ramp", "gradient"), &NoiseTexture2D::set_color_ramp);
	ClassDB::bind_method(D_METHOD("get_color_ramp"), &NoiseTexture2D::get_color_ramp);
	ClassDB::bind_method(D_METHOD("set_noise", "noise"), &NoiseTexture2D::set_noise);
	ClassDB::bind_method(D_METHOD("get_noise"), &NoiseTexture2D::get_noise);
	ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_width", "get_width");
	ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_height", "get_height");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "invert"), "set_invert", "get_invert");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "in_3d_space"), "set_in_3d_space", "is_in_3d_space");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps"), "set_generate_mipmaps", "is_generating_mipmaps");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "seamless"), "set_seamless", "get_seamless");
	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "seamless_blend_skirt", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_seamless_blend_skirt", "get_seamless_blend_skirt");
	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "as_normal_map"), "set_as_normal_map", "is_normal_map");
	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bump_strength", PROPERTY_HINT_RANGE, "0,32,0.1,or_greater"), "set_bump_strength", "get_bump_strength");
	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_color_ramp", "get_color_ramp");
	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "noise", PROPERTY_HINT_RESOURCE_TYPE, "Noise"), "set_noise", "get_noise");
}
void NoiseTexture2D::_validate_property(PropertyInfo &p_property) const {
	if (p_property.name == "bump_strength") {
		if (!as_normal_map) {
			p_property.usage = PROPERTY_USAGE_NO_EDITOR;
		}
	}
	if (p_property.name == "seamless_blend_skirt") {
		if (!seamless) {
			p_property.usage = PROPERTY_USAGE_NO_EDITOR;
		}
	}
}
void NoiseTexture2D::_set_texture_image(const Ref<Image> &p_image) {