varying float dist;
//....
dist = length(vec3( gl_Position.xy / vec2(gm_Matrices[MATRIX_PROJECTION][0][0],gm_Matrices[MATRIX_PROJECTION][1][1]), gl_Position.w ));
float fog_level = clamp((dist-fog.x)*fog.y,0.0,1.0);
vec4 base_colour = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
gl_FragColor = vec4( mix( base_colour.rgb, fog_colour, fog_level ), base_colour.a );
///basic vertex shader with fog
attribute vec3 in_Position;
attribute vec4 in_Color;
attribute vec2 in_TextureCoord;
uniform vec3 view_pos;
varying vec4 v_color;
varying vec2 v_texcoord;
varying float v_depth;
void main()
{
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * vec4(in_Position, 1.0);
v_color = in_Color;
v_texcoord = in_TextureCoord;
v_depth = distance(view_pos, vec3(gm_Matrices[MATRIX_WORLD] * vec4(in_Position, 1.0)));
}
///basic pixel shader with fog
varying vec4 v_color;
varying vec2 v_texcoord;
varying float v_depth;
uniform vec3 fog_color;
uniform float fog_start;
uniform float fog_length;
void main()
{
gl_FragColor = v_color * texture2D(gm_BaseTexture, v_texcoord);
gl_FragColor.rgb = mix(gl_FragColor.rgb, fog_color, min(1.0, max(0.0, v_depth - fog_start) / fog_length));
}
How does i can set the uniform view_pos? is with shader_set_uniform_* functions? What is happening here, because i don't know yet.uniform vec3 view_pos;
//in create event
uid_view_pos = shader_get_uniform(shader, "view_pos")
uid_fog_start = shader_get_uniform(shader, "fog_start")
uid_fog_length = shader_get_uniform(shader, "fog_length")
uid_fog_color = shader_get_uniform(shader, "fog_color")
fog_start = 2000
fog_end = 10000
fog_color = make_color_hsv(fog_hue, fog_sat, fog_val)
//convert color to 3 component array\vec3:
fog_color_rgb[0] = color_get_red(fog_color) / 255
fog_color_rgb[1] = color_get_green(fog_color) / 255
fog_color_rgb[2] = color_get_blue(fog_color) / 255
//or get 3 separate variables:
fog_color_r = color_get_red(fog_color) / 255
fog_color_g = color_get_green(fog_color) / 255
fog_color_b = color_get_blue(fog_color) / 255
//in draw event
d3d_set_projection(view_x, view_y, view_z, view_x2, view_y2, view_z2, 0, 0, -1)
shader_set(shader)
shader_set_uniform_f(uid_view_pos, view_x, view_y, view_z)
shader_set_uniform_f(uid_fog_start, fog_start)
shader_set_uniform_f(uid_fog_length, fog_length)
shader_set_uniform_f_array(uid_fog_color, fog_color) //set vec3 array
shader_set_uniform_f(uid_fog_color, fog_color_r, fog_color_g, fog_color_b) //or set 3 separate values
//draw stuff
shader_reset()