2020-09-26 22:05:43 +00:00
|
|
|
#version 450 core
|
2020-09-27 20:25:35 +00:00
|
|
|
#extension GL_ARB_separate_shader_objects : enable
|
2020-09-26 22:05:43 +00:00
|
|
|
|
|
|
|
layout (constant_id = 0) const bool FOG = true;
|
|
|
|
layout (constant_id = 1) const bool PBR = true;
|
|
|
|
// FS spe
|
|
|
|
layout (constant_id = 5) const bool DO_CURVATURE = false;
|
|
|
|
layout (constant_id = 6) const bool CURV_DEPTH = true;
|
|
|
|
|
2020-09-29 19:28:11 +00:00
|
|
|
layout (binding = 0) uniform UniformBufferObject {
|
|
|
|
vec3 FogColor;
|
|
|
|
float FogDepth;
|
|
|
|
|
|
|
|
vec3 LightInvDirection_worldspace;
|
|
|
|
} UBO;
|
|
|
|
|
2020-09-27 20:25:35 +00:00
|
|
|
layout(push_constant) uniform PushConstants {
|
2020-09-29 19:28:11 +00:00
|
|
|
mat4 Proj; //MAYBE: move Proj View to UBO
|
2020-09-27 20:25:35 +00:00
|
|
|
mat4 View;
|
|
|
|
#ifndef INSTANCED
|
|
|
|
mat4 Model;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
vec4 SphereProj;
|
|
|
|
float Curvature;
|
|
|
|
} Push;
|
|
|
|
|
|
|
|
layout (location = 0) in vec3 Position_modelspace;
|
|
|
|
layout (location = 1) in uint Texture_model;
|
|
|
|
layout (location = 2) in vec3 Normal_modelspace;
|
|
|
|
|
|
|
|
#ifdef INSTANCED
|
|
|
|
layout (location = 6) in mat4 Model;
|
|
|
|
#endif
|
2020-09-26 22:05:43 +00:00
|
|
|
|
2020-09-27 20:25:35 +00:00
|
|
|
layout (location = 0) out VertexData {
|
2020-09-26 22:05:43 +00:00
|
|
|
vec3 Position_modelspace;
|
|
|
|
flat uint Texture;
|
|
|
|
vec3 FaceNormal_modelspace;
|
|
|
|
|
|
|
|
vec3 FaceNormal_worldspace;
|
|
|
|
vec3 EyeDirection_cameraspace;
|
|
|
|
vec3 LightDirection_cameraspace;
|
|
|
|
|
|
|
|
float Depth;
|
|
|
|
} vs;
|
|
|
|
|
2020-09-27 20:25:35 +00:00
|
|
|
void main(){
|
|
|
|
#ifndef INSTANCED
|
|
|
|
mat4 Model = Push.Model;
|
2020-09-26 22:05:43 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
vs.Position_modelspace = Position_modelspace;
|
|
|
|
|
|
|
|
if(DO_CURVATURE) {
|
2020-09-27 20:25:35 +00:00
|
|
|
if(Push.Curvature > 0) {
|
|
|
|
vec3 Position_areaspace = Position_modelspace + Push.SphereProj.xyz;
|
2020-09-26 22:05:43 +00:00
|
|
|
vec2 sph = vec2(acos(Position_areaspace.z / length(Position_areaspace.xyz)), atan(Position_areaspace.y, Position_areaspace.x));
|
2020-09-27 20:25:35 +00:00
|
|
|
float radius = CURV_DEPTH ?
|
|
|
|
max(max(abs(Position_areaspace.x), abs(Position_areaspace.y)), abs(Position_areaspace.z)) :
|
|
|
|
Push.SphereProj.w;
|
|
|
|
vs.Position_modelspace = mix(vs.Position_modelspace, vec3(sin(sph.x)*cos(sph.y), sin(sph.x)*sin(sph.y), cos(sph.x)) * radius - Push.SphereProj.xyz, Push.Curvature);
|
2020-09-26 22:05:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-27 20:25:35 +00:00
|
|
|
vec4 Position_cameraspace = Push.View * Model * vec4(vs.Position_modelspace, 1);
|
|
|
|
gl_Position = Push.Proj * Position_cameraspace;
|
2020-09-26 22:05:43 +00:00
|
|
|
|
|
|
|
if(FOG) {
|
2020-09-29 19:28:11 +00:00
|
|
|
vs.Depth = length(Position_cameraspace.xyz) / UBO.FogDepth;
|
2020-09-26 22:05:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vs.Texture = Texture_model;
|
|
|
|
|
|
|
|
vs.FaceNormal_modelspace = normalize(Normal_modelspace);
|
2020-09-27 20:25:35 +00:00
|
|
|
if(PBR) {
|
2020-09-26 22:05:43 +00:00
|
|
|
// TODO: correct normal curvature
|
|
|
|
vs.FaceNormal_worldspace = normalize((Model * vec4(vs.FaceNormal_modelspace, 0)).xyz);
|
|
|
|
|
|
|
|
// Vector that goes from the vertex to the camera, in camera space.
|
|
|
|
// In camera space, the camera is at the origin (0,0,0).
|
|
|
|
vs.EyeDirection_cameraspace = vec3(0,0,0) - Position_cameraspace.xyz;
|
|
|
|
|
|
|
|
// Vector that goes from the vertex to the light, in camera space
|
2020-09-29 19:28:11 +00:00
|
|
|
vs.LightDirection_cameraspace = (Push.View * vec4(UBO.LightInvDirection_worldspace,0)).xyz;
|
2020-09-26 22:05:43 +00:00
|
|
|
}
|
|
|
|
}
|