mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-23 17:30:42 +00:00
7537cb8d1c
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).
34 lines
814 B
Text
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;
|
|
}
|