Files
UnrealEngineUWP/Engine/Shaders/LPVPacking.usf
Martin Mittring ef2256631b updated LightPropagationVolume (from Lionhead Studios)
* reduced order of SH (faster but a bit more blurry)
* DirectionalOcclusion (disabled by default, can be enabled in PostProcessSettings, affects SkyLight and ReflectionEnvironments but not AmbientCube)
* Material BlockGI feature
* Spotlight support
* Uses AsyncCompute on XboxOne as optimization (order is not optimized yet)

[CL 2553823 by Martin Mittring in Main branch]
2015-05-15 18:54:37 -04:00

113 lines
4.2 KiB
Plaintext

//-----------------------------------------------------------------------------
// File: LPVPacking.usf
//
// Summary: Common functionality for LPV compute shaders
//
// Created: 2015-04-15
//
// Author: Ben Woodhouse - mailto:benwood@microsoft.com
//
// Copyright (C) Microsoft. All rights reserved.
//-----------------------------------------------------------------------------
//------------------------------------------------------------------------------
struct LPVCellPacked
{
uint packedCoeffs[14];
};
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
LPVCellPacked PackLPVCell( LPVCell cellIn )
{
LPVCellPacked cellOut;
uint3 compressedCoeffs[9];
[unroll]
for ( int i=0; i<9; i++ )
{
compressedCoeffs[i] = f32tof16( cellIn.coeffs[i] );
}
uint compressedAO = f32tof16( cellIn.AO );
cellOut.packedCoeffs[0] = compressedCoeffs[0].x | ( compressedCoeffs[0].y << 16 );
cellOut.packedCoeffs[1] = compressedCoeffs[0].z | ( compressedCoeffs[1].x << 16 );
cellOut.packedCoeffs[2] = compressedCoeffs[1].y | ( compressedCoeffs[1].z << 16 );
cellOut.packedCoeffs[3] = compressedCoeffs[2].x | ( compressedCoeffs[2].y << 16 );
cellOut.packedCoeffs[4] = compressedCoeffs[2].z | ( compressedCoeffs[3].x << 16 );
cellOut.packedCoeffs[5] = compressedCoeffs[3].y | ( compressedCoeffs[3].z << 16 );
cellOut.packedCoeffs[6] = compressedCoeffs[4].x | ( compressedCoeffs[4].y << 16 );
cellOut.packedCoeffs[7] = compressedCoeffs[4].z | ( compressedCoeffs[5].x << 16 );
cellOut.packedCoeffs[8] = compressedCoeffs[5].y | ( compressedCoeffs[5].z << 16 );
cellOut.packedCoeffs[9] = compressedCoeffs[6].x | ( compressedCoeffs[6].y << 16 );
cellOut.packedCoeffs[10] = compressedCoeffs[6].z | ( compressedCoeffs[7].x << 16 );
cellOut.packedCoeffs[11] = compressedCoeffs[7].y | ( compressedCoeffs[7].z << 16 );
cellOut.packedCoeffs[12] = compressedCoeffs[8].x | ( compressedCoeffs[8].y << 16 );
cellOut.packedCoeffs[13] = compressedCoeffs[8].z | ( compressedAO << 16 );
return cellOut;
}
//-------------------------------------------------------------------------------------------------
LPVCell UnpackLPVCell( LPVCellPacked cellPacked )
{
LPVCell cellOut;
uint3 compressedCoeffs;
compressedCoeffs.x = cellPacked.packedCoeffs[0];
compressedCoeffs.y = cellPacked.packedCoeffs[0] >> 16;
compressedCoeffs.z = cellPacked.packedCoeffs[1];
cellOut.coeffs[0] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[1] >> 16;
compressedCoeffs.y = cellPacked.packedCoeffs[2];
compressedCoeffs.z = cellPacked.packedCoeffs[2] >> 16;
cellOut.coeffs[1] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[3];
compressedCoeffs.y = cellPacked.packedCoeffs[3] >> 16;
compressedCoeffs.z = cellPacked.packedCoeffs[4];
cellOut.coeffs[2] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[4] >> 16;
compressedCoeffs.y = cellPacked.packedCoeffs[5];
compressedCoeffs.z = cellPacked.packedCoeffs[5] >> 16;
cellOut.coeffs[3] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[6];
compressedCoeffs.y = cellPacked.packedCoeffs[6] >> 16;
compressedCoeffs.z = cellPacked.packedCoeffs[7];
cellOut.coeffs[4] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[7] >> 16;
compressedCoeffs.y = cellPacked.packedCoeffs[8];
compressedCoeffs.z = cellPacked.packedCoeffs[8] >> 16;
cellOut.coeffs[5] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[9];
compressedCoeffs.y = cellPacked.packedCoeffs[9] >> 16;
compressedCoeffs.z = cellPacked.packedCoeffs[10];
cellOut.coeffs[6] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[10] >> 16;
compressedCoeffs.y = cellPacked.packedCoeffs[11];
compressedCoeffs.z = cellPacked.packedCoeffs[11] >> 16;
cellOut.coeffs[7] = f16tof32( compressedCoeffs );
compressedCoeffs.x = cellPacked.packedCoeffs[12];
compressedCoeffs.y = cellPacked.packedCoeffs[12] >> 16;
compressedCoeffs.z = cellPacked.packedCoeffs[13];
cellOut.coeffs[8] = f16tof32( compressedCoeffs );
cellOut.AO = f16tof32( cellPacked.packedCoeffs[13] >> 16 );
return cellOut;
}