131 lines
2.8 KiB
GLSL
131 lines
2.8 KiB
GLSL
#[vertex]
|
|
|
|
#version 450
|
|
|
|
#VERSION_DEFINES
|
|
|
|
layout(location = 0) in highp vec3 vertex;
|
|
|
|
#ifdef POSITIONAL_SHADOW
|
|
layout(push_constant, std430) uniform Constants {
|
|
mat2x4 modelview;
|
|
vec4 rotation;
|
|
vec2 direction;
|
|
float z_far;
|
|
uint pad;
|
|
float z_near;
|
|
uint cull_mode;
|
|
float pad3;
|
|
float pad4;
|
|
}
|
|
constants;
|
|
|
|
layout(set = 0, binding = 0, std430) restrict readonly buffer OccluderTransforms {
|
|
mat2x4 transforms[];
|
|
}
|
|
occluder_transforms;
|
|
|
|
#else
|
|
|
|
layout(push_constant, std430) uniform Constants {
|
|
mat4 projection;
|
|
mat2x4 modelview;
|
|
vec2 direction;
|
|
float z_far;
|
|
uint cull_mode;
|
|
}
|
|
constants;
|
|
|
|
#endif
|
|
|
|
#ifdef MODE_SHADOW
|
|
layout(location = 0) out highp float depth;
|
|
#endif
|
|
|
|
void main() {
|
|
#ifdef POSITIONAL_SHADOW
|
|
float c = -(constants.z_far + constants.z_near) / (constants.z_far - constants.z_near);
|
|
float d = -2.0 * constants.z_far * constants.z_near / (constants.z_far - constants.z_near);
|
|
|
|
mat4 projection = mat4(vec4(1.0, 0.0, 0.0, 0.0),
|
|
vec4(0.0, 1.0, 0.0, 0.0),
|
|
vec4(0.0, 0.0, c, -1.0),
|
|
vec4(0.0, 0.0, d, 0.0));
|
|
|
|
// Precomputed:
|
|
// Vector3 cam_target = Basis::from_euler(Vector3(0, 0, Math_TAU * ((i + 3) / 4.0))).xform(Vector3(0, 1, 0));
|
|
// projection = projection * Projection(Transform3D().looking_at(cam_targets[i], Vector3(0, 0, -1)).affine_inverse());
|
|
projection *= mat4(vec4(constants.rotation.x, 0.0, constants.rotation.y, 0.0), vec4(constants.rotation.z, 0.0, constants.rotation.w, 0.0), vec4(0.0, -1.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
|
|
mat4 modelview = mat4(occluder_transforms.transforms[constants.pad]) * mat4(constants.modelview);
|
|
#else
|
|
mat4 projection = constants.projection;
|
|
mat4 modelview = mat4(constants.modelview[0], constants.modelview[1], vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0));
|
|
#endif
|
|
|
|
highp vec4 vtx = vec4(vertex, 1.0) * modelview;
|
|
|
|
#ifdef MODE_SHADOW
|
|
depth = dot(constants.direction, vtx.xy);
|
|
#endif
|
|
|
|
gl_Position = projection * vtx;
|
|
}
|
|
|
|
#[fragment]
|
|
|
|
#version 450
|
|
|
|
#VERSION_DEFINES
|
|
|
|
#ifdef POSITIONAL_SHADOW
|
|
layout(push_constant, std430) uniform Constants {
|
|
mat2x4 modelview;
|
|
vec4 rotation;
|
|
vec2 direction;
|
|
float z_far;
|
|
uint pad;
|
|
float z_near;
|
|
uint cull_mode;
|
|
float pad3;
|
|
float pad4;
|
|
}
|
|
constants;
|
|
|
|
#else
|
|
|
|
layout(push_constant, std430) uniform Constants {
|
|
mat4 projection;
|
|
mat2x4 modelview;
|
|
vec2 direction;
|
|
float z_far;
|
|
uint cull_mode;
|
|
}
|
|
constants;
|
|
|
|
#endif
|
|
|
|
#ifdef MODE_SHADOW
|
|
layout(location = 0) in highp float depth;
|
|
layout(location = 0) out highp float distance_buf;
|
|
#else
|
|
layout(location = 0) out highp float sdf_buf;
|
|
#endif
|
|
|
|
#define POLYGON_CULL_DISABLED 0
|
|
#define POLYGON_CULL_FRONT 1
|
|
#define POLYGON_CULL_BACK 2
|
|
|
|
void main() {
|
|
#ifdef MODE_SHADOW
|
|
bool front_facing = gl_FrontFacing;
|
|
if (constants.cull_mode == POLYGON_CULL_BACK && !front_facing) {
|
|
discard;
|
|
} else if (constants.cull_mode == POLYGON_CULL_FRONT && front_facing) {
|
|
discard;
|
|
}
|
|
distance_buf = depth / constants.z_far;
|
|
#else
|
|
sdf_buf = 1.0;
|
|
#endif
|
|
}
|