#version 450
layout(location = 0) in vec3 normal;
layout(location = 1) in vec2 uv;
layout(location = 2) in vec3 view;
layout(location = 3) in vec3 mpos;
/*layout(set = 0, binding = 0) uniform sampler2D diffuse;
layout(set = 0, binding = 1) uniform sampler2D specular;*/
layout(set = 0, binding = 0) uniform sampler2D normal_map;
layout(location = 0) out vec4 color;
layout(location = 1) out vec2 velocity;
layout(set = 1, binding = 0) buffer Projection
{
mat4 view,
projection;
uvec2 res;
}projection;
layout(set = 1, binding = 1) buffer PrevMvps
{
mat4 mvp;
}prev;
//http://www.thetenthplanet.de/archives/1180
mat3 cotangent_frame( vec3 N, vec3 p, vec2 uv ) {
// get edge vectors of the pixel triangle
vec3 dp1 = dFdx( p );
vec3 dp2 = dFdy( p );
vec2 duv1 = dFdx( uv );
vec2 duv2 = dFdy( uv );
// solve the linear system
vec3 dp2perp = cross( dp2, N );
vec3 dp1perp = cross( N, dp1 );
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
// construct a scale-invariant frame
float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );
return mat3( T * invmax, B * invmax, N );
}
#define WITH_NORMALMAP_UNSIGNED
vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord ) {
// assume N, the interpolated vertex normal and
// V, the view vector (vertex to eye)
vec3 map = texture( normal_map, texcoord ).xyz;
#ifdef WITH_NORMALMAP_UNSIGNED
map = map * 255./127. - 128./127.;
#endif
#ifdef WITH_NORMALMAP_2CHANNEL
map.z = sqrt( 1. - dot( map.xy, map.xy ) );
#endif
#ifdef WITH_NORMALMAP_GREEN_UP
map.y = -map.y;
#endif
mat3 TBN = cotangent_frame( N, -V, texcoord );
return normalize( TBN * (map - vec3 (0.07, 0.07, 0.0)));
}
void main()
{
//color.xyz = (normal)/2.0+0.5;
color.xyz = perturb_normal(normal, view, uv) / 2.0+0.5;
//color.xyz = normal/2.0+0.5;
color.w = 1;
vec4 prev_spos = prev.mvp * vec4(mpos, 1.0);
prev_spos.xyz /= prev_spos.w;
vec2 svelocity = gl_FragCoord.xy / vec2(projection.res) - (prev_spos.xy / 2 + 0.5);
velocity = svelocity / 2 + 0.5;
}