quakeforge/libs/video/renderer/vulkan/shader/oit_blend.finc
Bill Currie 7537cb8d1c [vulkan] Correct OIT sorting
The reversed depth buffer is very nice, but it also reversed the OIT
blending. Too much demo watching not enough walking around in the maps
(especially start near the episode 4 gate).
2023-08-04 14:51:49 +09:00

34 lines
814 B
Text

#include "oit.h"
vec4
BlendFrags (vec4 color)
{
#define MAX_FRAGMENTS 64
FragData frags[MAX_FRAGMENTS];
int numFrags = 0;
ivec3 coord = ivec3(gl_FragCoord.xy, gl_ViewIndex);
int index = imageLoad (heads, coord).r;
//FIXME use a heap and prioritize closer fragments
while (index != -1 && numFrags < MAX_FRAGMENTS) {
frags[numFrags] = fragments[index];
numFrags++;
index = fragments[index].next;
}
//insertion sort
for (int i = 1; i < numFrags; i++) {
FragData toInsert = frags[i];
int j = i;
while (j > 0 && toInsert.depth < frags[j - 1].depth) {
frags[j] = frags[j - 1];
j--;
}
frags[j] = toInsert;
}
for (int i = 0; i < numFrags; i++) {
color = mix (color, frags[i].color,
clamp (frags[i].color.a, 0.0f, 1.0f));
}
return color;
}