123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #[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
- }
|