mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
42 lines
1.1 KiB
GLSL
42 lines
1.1 KiB
GLSL
|
#version 450
|
||
|
|
||
|
#extension GL_AMD_shader_fragment_mask: enable
|
||
|
|
||
|
layout(constant_id = 0) const int c_samples = 1;
|
||
|
|
||
|
layout(set = 0, binding = 0)
|
||
|
uniform sampler2DMSArray s_image;
|
||
|
|
||
|
layout(location = 0) out vec4 o_color;
|
||
|
|
||
|
void main() {
|
||
|
ivec3 coord = ivec3(gl_FragCoord.xy, gl_Layer);
|
||
|
|
||
|
// get a four-bit fragment index for each sample
|
||
|
uint fragMask = fragmentMaskFetchAMD(s_image, coord);
|
||
|
|
||
|
// count number of occurences of each fragment
|
||
|
// index in one four-bit counter for each sample
|
||
|
uint fragCount = 0u;
|
||
|
|
||
|
for (int i = 0; i < 4 * c_samples; i += 4) {
|
||
|
uint fragIndex = bitfieldExtract(fragMask, i, 4);
|
||
|
fragCount += 1u << (fragIndex << 2);
|
||
|
}
|
||
|
|
||
|
// perform necessary texture lookups to compute
|
||
|
// final fragment color
|
||
|
o_color = vec4(0.0f);
|
||
|
|
||
|
while (fragCount != 0) {
|
||
|
int fragIndex = findLSB(fragCount) >> 2;
|
||
|
int fragShift = fragIndex << 2;
|
||
|
|
||
|
o_color += fragmentFetchAMD(s_image, coord, fragIndex)
|
||
|
* float(bitfieldExtract(fragCount, fragShift, 4));
|
||
|
|
||
|
fragCount = bitfieldInsert(fragCount, 0, fragShift, 4);
|
||
|
}
|
||
|
|
||
|
o_color /= float(c_samples);
|
||
|
}
|