forked from LeenkxTeam/LNXSDK
85 lines
2.9 KiB
Plaintext
85 lines
2.9 KiB
Plaintext
|
|
||
|
// Courtesy of
|
||
|
// https://github.com/GreatBlambo/voxel_cone_tracing
|
||
|
// https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf
|
||
|
|
||
|
|
||
|
uint convVec4ToRGBA8(vec4 val) {
|
||
|
vec4 col = vec4(val) * 255;
|
||
|
return (uint(col.w) & 0x000000FF) << 24U
|
||
|
| (uint(col.z) & 0x000000FF) << 16U
|
||
|
| (uint(col.y) & 0x000000FF) << 8U
|
||
|
| (uint(col.x) & 0x000000FF);
|
||
|
}
|
||
|
|
||
|
vec4 convRGBA8ToVec4(uint val) {
|
||
|
uvec4 col = uvec4(
|
||
|
float((val & 0x000000FF)),
|
||
|
float((val & 0x0000FF00) >> 8U),
|
||
|
float((val & 0x00FF0000) >> 16U),
|
||
|
float((val & 0xFF000000) >> 24U));
|
||
|
return vec4(col) / 255;
|
||
|
}
|
||
|
|
||
|
// uint encUnsignedNibble(uint m, uint n) {
|
||
|
// return (m & 0xFEFEFEFE)
|
||
|
// | (n & 0x00000001)
|
||
|
// | (n & 0x00000002) << 7U
|
||
|
// | (n & 0x00000004) << 14U
|
||
|
// | (n & 0x00000008) << 21U;
|
||
|
// }
|
||
|
|
||
|
// uint decUnsignedNibble(uint m) {
|
||
|
// return (m & 0x00000001)
|
||
|
// | (m & 0x00000100) >> 7U
|
||
|
// | (m & 0x00010000) >> 14U
|
||
|
// | (m & 0x01000000) >> 21U;
|
||
|
// }
|
||
|
|
||
|
// void imageAtomicRGBA8Avg(layout(r32ui) uimage3D img, ivec3 coords, vec4 val) {
|
||
|
// // LSBs are used for the sample counter of the moving average.
|
||
|
// val *= 255.0;
|
||
|
// uint newVal = encUnsignedNibble(convVec4ToRGBA8(val), 1);
|
||
|
// uint prevStoredVal = 0;
|
||
|
// uint currStoredVal;
|
||
|
// int counter = 0;
|
||
|
// // Loop as long as destination value gets changed by other threads
|
||
|
// while ((currStoredVal = imageAtomicCompSwap(img, coords, prevStoredVal, newVal)) != prevStoredVal && counter < 16) {
|
||
|
// vec4 rval = convRGBA8ToVec4(currStoredVal & 0xFEFEFEFE);
|
||
|
// uint n = decUnsignedNibble(currStoredVal);
|
||
|
// rval = rval * n + val;
|
||
|
// rval /= ++n;
|
||
|
// rval = round(rval / 2) * 2;
|
||
|
// newVal = encUnsignedNibble(convVec4ToRGBA8(rval), n);
|
||
|
// prevStoredVal = currStoredVal;
|
||
|
// counter++;
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// void imageAtomicFloatAdd(layout(r32ui) coherent volatile uimage3D imgUI, ivec3 coords, float val) {
|
||
|
// uint newVal = floatBitsToUint(val);
|
||
|
// uint prevVal = 0;
|
||
|
// uint curVal;
|
||
|
// // Loop as long as destination value gets changed by other threads
|
||
|
// while ((curVal = imageAtomicCompSwap(imgUI, coords, prevVal, newVal)) != prevVal) {
|
||
|
// prevVal = curVal;
|
||
|
// newVal = floatBitsToUint((val + uintBitsToFloat(curVal)));
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// void imageAtomicRGBA8Avg( layout ( r32ui ) coherent volatile uimage3D imgUI , ivec3 coords , vec4 val ) {
|
||
|
// val.rgb *= 255.0f; // Optimise following calculations
|
||
|
// uint newVal = convVec4ToRGBA8(val);
|
||
|
// uint prevStoredVal = 0;
|
||
|
// uint curStoredVal;
|
||
|
// // Loop as long as destination value gets changed by other threads
|
||
|
// while ((curStoredVal = imageAtomicCompSwap(imgUI, coords, prevStoredVal, newVal)) != prevStoredVal) {
|
||
|
// prevStoredVal = curStoredVal;
|
||
|
// vec4 rval = convRGBA8ToVec4(curStoredVal);
|
||
|
// rval.xyz = (rval.xyz * rval.w) ; // Denormalize
|
||
|
// vec4 curValF = rval + val; // Add new value
|
||
|
// curValF.xyz /= (curValF.w); // Renormalize
|
||
|
// newVal = convVec4ToRGBA8(curValF);
|
||
|
// }
|
||
|
// }
|