#version 450 // 64 bytes layout(push_constant) uniform Transform { mat4 mvp; }; layout(set = 1, binding = 0) uniform UBO { // VERTEX vec4 eyePos; vec4 lightPos; // VERTEX-FOG vec4 fogDistanceVector; vec4 fogDepthVector; vec4 fogEyeT; // FRAGMENT vec4 lightColor; vec4 fogColor; // linear dynamic light vec4 lightVector; }; layout(location = 0) in vec3 in_position; layout(location = 1) in vec2 in_tex_coord; layout(location = 2) in vec3 in_normal; layout(location = 0) out vec2 frag_tex_coord; layout(location = 1) out vec3 N; // normal array layout(location = 2) out vec4 L; // object-space light vector layout(location = 3) out vec4 V; // object-space view vector #ifdef USE_FOG layout(location = 4) out vec2 fog_tex_coord; #endif out gl_PerVertex { vec4 gl_Position; }; void main() { gl_Position = mvp * vec4(in_position, 1.0); frag_tex_coord = in_tex_coord; N = in_normal; L = lightPos - vec4(in_position, 1.0); V = eyePos - vec4(in_position, 1.0); #ifdef USE_FOG float s = dot(in_position, fogDistanceVector.xyz) + fogDistanceVector.w; float t = dot(in_position, fogDepthVector.xyz) + fogDepthVector.w; if ( fogEyeT.y == 1.0 ) { if ( t < 0.0 ) { t = 1.0 / 32.0; } else { t = 31.0 / 32.0; } } else { if ( t < 1.0 ) { t = 1.0 / 32.0; } else { t = 1.0 / 32.0 + (30.0 / 32.0 * t) / ( t - fogEyeT.x ); } } fog_tex_coord = vec2(s, t); #endif }