54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
|
/**
|
||
|
* @ Version: SCREEN SPACE SHADERS - UPDATE 20
|
||
|
* @ Description: LUT shader
|
||
|
* @ Modified time: 2024-01-22 04:12
|
||
|
* @ Author: https://www.moddb.com/members/ascii1457
|
||
|
* @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders
|
||
|
*/
|
||
|
|
||
|
// Settings
|
||
|
#include "settings_screenspace_LUT.h"
|
||
|
|
||
|
// Internal --
|
||
|
#define LUT_GROUPS max(1, G_CELLS_GROUPS)
|
||
|
#define TEXEL_SIZE float2(1.0f / G_LUT_SIZE_W, 1.0f / (G_CELLS_SIZE * LUT_GROUPS))
|
||
|
#define TEXEL_HALF float2(TEXEL_SIZE.xy / 2.0f)
|
||
|
#define TEXEL_FIX TEXEL_SIZE.y * LUT_GROUPS
|
||
|
|
||
|
uniform float4 ssfx_lut;
|
||
|
|
||
|
float3 ssfx_lut_pp(float3 base_col)
|
||
|
{
|
||
|
// Prepare LUT UVs
|
||
|
float3 cells = base_col * G_CELLS_SIZE - base_col;
|
||
|
float lut_frac = frac(cells.b);
|
||
|
cells.rg = TEXEL_HALF + cells.rg * TEXEL_SIZE;
|
||
|
cells.r += (cells.b - lut_frac) * TEXEL_FIX;
|
||
|
|
||
|
// Final LUT UVs
|
||
|
float4 uvs = float4(cells.rg, cells.r + TEXEL_FIX, cells.g);
|
||
|
|
||
|
// Group offset
|
||
|
float2 grp_offset = float2(0.0, ssfx_lut.y / LUT_GROUPS);
|
||
|
|
||
|
// Sample LUTs
|
||
|
float3 lut_col = lerp( s_lut_atlas.Sample(smp_linear, uvs.xy + grp_offset).rgb,
|
||
|
s_lut_atlas.Sample(smp_linear, uvs.zw + grp_offset).rgb,
|
||
|
lut_frac);
|
||
|
|
||
|
#ifdef G_ADVANCE_TRANSITION
|
||
|
|
||
|
// Group2 offset
|
||
|
grp_offset = float2(0.0, ssfx_lut.z / LUT_GROUPS);
|
||
|
|
||
|
// Sample transition LUTs
|
||
|
float3 SecondLUT = lerp(s_lut_atlas.Sample(smp_linear, uvs.xy + grp_offset).rgb,
|
||
|
s_lut_atlas.Sample(smp_linear, uvs.zw + grp_offset).rgb,
|
||
|
lut_frac);
|
||
|
|
||
|
lut_col = lerp(lut_col, SecondLUT, ssfx_lut.w);
|
||
|
#endif
|
||
|
|
||
|
return lerp(base_col.rgb, lut_col.rgb, ssfx_lut.x);
|
||
|
|
||
|
}
|