diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index 08a5eae035b1a737885b301cf98eaf4697d192df..a6b182154ca182b0c2bc58e44e9e2531e5592d88 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -391,7 +391,7 @@ function _M:call(x, y, pos, entity)
 	if entity then
 		-- Instanciate shader
 		if entity.shader and type(entity.shader) == "string" then
-			entity.shader = Shader.new(entity.shader)
+			entity.shader = Shader.new(entity.shader, entity.shader_args)
 		end
 
 		self.map[x + y * self.w][pos] = entity
diff --git a/game/engine/Shader.lua b/game/engine/Shader.lua
index b398285bb9d983ceea28415f4721ba5aa6798900..86b37fd047a66e9cc0e77238284981339ddb7b7b 100644
--- a/game/engine/Shader.lua
+++ b/game/engine/Shader.lua
@@ -29,7 +29,7 @@ _M.progs = {}
 
 --- Make a shader
 function _M:init(name, args)
-	self.args = args
+	self.args = args or {}
 	self.name = name
 
 	self:loaded()
@@ -96,4 +96,14 @@ function _M:loaded()
 	end
 
 	self.shad = _M.progs[self.name]
+
+	for k, v in pairs(self.args) do
+		if type(v) == "number" then
+			self.shad:paramNumber(k, v)
+		elseif type(v) == "table"
+			if v.texture then
+				self.shad:paramNumber(k, v.texture, v.is3d)
+			end
+		end
+	end
 end
diff --git a/src/map.c b/src/map.c
index 80e7628573b7a0c1a8253fdfce8e8b4b62c85772..569e7f544df2d355c86792e5ef277177cb719ff7 100644
--- a/src/map.c
+++ b/src/map.c
@@ -29,7 +29,7 @@
 #include "tSDL.h"
 //#include "shaders.h"
 
-extern void useShader(GLuint p);
+extern void useShader(GLuint p, int x, int y);
 
 // Minimap defines
 #define MM_FLOOR 1
@@ -371,7 +371,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -388,7 +388,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_trap[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -405,7 +405,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -422,7 +422,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -442,7 +442,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -459,7 +459,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -476,7 +476,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_trap[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -493,7 +493,7 @@ static int map_to_screen(lua_State *L)
 								glColor4f((map->shown_r + m->tint_r)/2, (map->shown_g + m->tint_g)/2, (map->shown_b + m->tint_b)/2, a);
 							else
 								glColor4f(map->shown_r, map->shown_g, map->shown_b, a);
-							if (m->shader) useShader(m->shader);
+							if (m->shader) useShader(m->shader, i, j);
 							glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
@@ -514,7 +514,7 @@ static int map_to_screen(lua_State *L)
 							glColor4f((map->obscure_r + m->tint_r)/2, (map->obscure_g + m->tint_g)/2, (map->obscure_b + m->tint_b)/2, map->obscure_a);
 						else
 							glColor4f(map->obscure_r, map->obscure_g, map->obscure_b, map->obscure_a);
-						if (m->shader) useShader(m->shader);
+						if (m->shader) useShader(m->shader, i, j);
 						glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j].texture);
 						glBegin(GL_QUADS);
 						glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
diff --git a/src/shaders.c b/src/shaders.c
index c85a447c9042cf0e15c8db88cf0a3870f4e494c9..775de18b50964647e4aec26e36208bcc35d6ca62 100644
--- a/src/shaders.c
+++ b/src/shaders.c
@@ -32,95 +32,16 @@
 
 bool shaders_active = TRUE;
 
-int noise3DTexSize = 128;
-GLuint noise3DTexName = 0;
-GLubyte noise3DTexPtr[128][128][128][4];
-int noise2DTexSize = 128;
-GLuint noise2DTexName = 0;
-GLubyte noise2DTexPtr[128][128][3];
-
-void make3DNoiseTexture(void)
+void useShader(GLuint p, int x, int y)
 {
-	static bool init = FALSE;
-	if (init) return;
-	init = TRUE;
-
-	int f, i, j, k, inc;
-	TCOD_noise_t noise = TCOD_noise_new(3, TCOD_NOISE_DEFAULT_HURST, TCOD_NOISE_DEFAULT_LACUNARITY);
-	float p[3];
-
-	for (i = 0; i < noise3DTexSize; ++i)
-	{
-		for (j = 0; j < noise3DTexSize; ++j)
-		{
-			for (k = 0; k < noise3DTexSize; ++k)
-			{
-				p[0] = i;
-				p[1] = j;
-				p[2] = k;
-				float v = ((TCOD_noise_simplex(noise, p) + 1) / 2) * 255;
-				noise3DTexPtr[i][j][k][0] = v;
-				noise3DTexPtr[i][j][k][1] = v;
-				noise3DTexPtr[i][j][k][2] = v;
-				noise3DTexPtr[i][j][k][3] = 255;
-			}
-		}
-	}
-
-	glGenTextures(1, &noise3DTexName);
-	glBindTexture(GL_TEXTURE_3D, noise3DTexName);
-	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 128, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, noise3DTexPtr);
-
-
-	for (i = 0; i < noise2DTexSize; ++i)
-	{
-		for (j = 0; j < noise2DTexSize; ++j)
-		{
-			p[0] = i;
-			p[1] = j;
-			p[2] = 1;
-			float v = ((TCOD_noise_simplex(noise, p) + 1) / 2) * 255;
-			noise2DTexPtr[i][j][0] = v;
-			noise2DTexPtr[i][j][1] = v;
-			noise2DTexPtr[i][j][2] = v;
-		}
-	}
-
-	glGenTextures(1, &noise2DTexName);
-	glBindTexture(GL_TEXTURE_2D, noise2DTexName);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-	CHECKGL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, noise2DTexPtr));
-}
-
-void useShader(GLuint p)
-{
-	make3DNoiseTexture();
-
 	CHECKGL(glUseProgramObjectARB(p));
 	GLint i = SDL_GetTicks();
 	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "tick"), 1, &i));
 
-	i = 1;
-	CHECKGL(glActiveTexture(GL_TEXTURE1));
-	CHECKGL(glBindTexture(GL_TEXTURE_3D, noise3DTexName));
-	CHECKGL(glEnable(GL_TEXTURE_2D));
-	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "noisevol"), 1, &i));
-
-	i = 2;
-	CHECKGL(glActiveTexture(GL_TEXTURE2));
-	CHECKGL(glBindTexture(GL_TEXTURE_2D, noise2DTexName));
-	CHECKGL(glEnable(GL_TEXTURE_2D));
-	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "noise2d"), 1, &i));
-
-	CHECKGL(glActiveTexture(GL_TEXTURE0));
+	i = x;
+	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "mapx"), 1, &i));
+	i = y;
+	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, "mapy"), 1, &i));
 }
 
 static GLuint loadShader(const char* code, GLuint type)
@@ -232,6 +153,31 @@ static int program_detach(lua_State *L)
 	return 0;
 }
 
+static int program_set_uniform_number(lua_State *L)
+{
+	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	const char *var = luaL_checkstring(L, 2);
+	GLfloat i = luaL_checknumber(L, 3);
+
+	CHECKGL(glUniform1fvARB(glGetUniformLocationARB(p, var), 1, &i));
+	return 0;
+}
+
+static int program_set_uniform_texture(lua_State *L)
+{
+	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	const char *var = luaL_checkstring(L, 2);
+	GLuint *t = (GLuint*)auxiliar_checkclass(L, "gl{texture}", 3);
+	bool is3d = lua_toboolean(L, 4);
+
+	GLint i = 1;
+	CHECKGL(glActiveTexture(GL_TEXTURE1));
+	CHECKGL(glBindTexture(is3d ? GL_TEXTURE_3D : GL_TEXTURE_2D, *t));
+	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, var), 1, &i));
+	CHECKGL(glActiveTexture(GL_TEXTURE0));
+	return 0;
+}
+
 static const struct luaL_reg shaderlib[] =
 {
 	{"newShader", shader_new},
@@ -245,6 +191,8 @@ static const struct luaL_reg program_reg[] =
 	{"compile", program_compile},
 	{"attach", program_attach},
 	{"detach", program_detach},
+	{"paramNumber", program_set_uniform_number},
+	{"paramTexture", program_set_uniform_texture},
 	{NULL, NULL},
 };