//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ReShade effect file //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Multi-LUT shader, using a texture atlas with multiple LUTs // by Otis / Infuse Project. // Based on Marty's LUT shader 1.0 for ReShade 3.0 // Copyright © 2008-2016 Marty McFly //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifndef fLUT_TextureName #define fLUT_TextureName "MultiLut_Atlas1.png" #endif #ifndef fLUT_TileSizeXY #define fLUT_TileSizeXY 32 #endif #ifndef fLUT_TileAmount #define fLUT_TileAmount 32 #endif #ifndef fLUT_LutAmount #define fLUT_LutAmount 17 #endif //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ uniform int fLUT_LutSelector < ui_type = "combo"; ui_min= 0; ui_max=16; ui_items="Neutral\0Color1\0Color2\0Color3 (Blue oriented)\0Color4 (Hollywood)\0Color5\0Color6\0Color7\0Color8\0Cool light\0Flat & green\0Red lift matte\0Cross process\0Azure Red Dual Tone\0Sepia\0\B&W mid constrast\0\B&W high contrast\0"; ui_label = "The LUT to use"; ui_tooltip = "The LUT to use for color transformation. 'Neutral' doesn't do any color transformation."; > = 0; uniform float fLUT_AmountChroma < ui_type = "drag"; ui_min = 0.00; ui_max = 1.00; ui_label = "LUT chroma amount"; ui_tooltip = "Intensity of color/chroma change of the LUT."; > = 1.00; uniform float fLUT_AmountLuma < ui_type = "drag"; ui_min = 0.00; ui_max = 1.00; ui_label = "LUT luma amount"; ui_tooltip = "Intensity of luma change of the LUT."; > = 1.00; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include "ReShade.fxh" texture texMultiLUT < source = fLUT_TextureName; > { Width = fLUT_TileSizeXY*fLUT_TileAmount; Height = fLUT_TileSizeXY * fLUT_LutAmount; Format = RGBA8; }; sampler SamplerMultiLUT { Texture = texMultiLUT; }; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void PS_MultiLUT_Apply(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 res : SV_Target0) { float4 color = tex2D(ReShade::BackBuffer, texcoord.xy); float2 texelsize = 1.0 / fLUT_TileSizeXY; texelsize.x /= fLUT_TileAmount; float3 lutcoord = float3((color.xy*fLUT_TileSizeXY-color.xy+0.5)*texelsize.xy,color.z*fLUT_TileSizeXY-color.z); lutcoord.y /= fLUT_LutAmount; lutcoord.y += (float(fLUT_LutSelector)/ fLUT_LutAmount); float lerpfact = frac(lutcoord.z); lutcoord.x += (lutcoord.z-lerpfact)*texelsize.y; float3 lutcolor = lerp(tex2D(SamplerMultiLUT, lutcoord.xy).xyz, tex2D(SamplerMultiLUT, float2(lutcoord.x+texelsize.y,lutcoord.y)).xyz,lerpfact); color.xyz = lerp(normalize(color.xyz), normalize(lutcolor.xyz), fLUT_AmountChroma) * lerp(length(color.xyz), length(lutcolor.xyz), fLUT_AmountLuma); res.xyz = color.xyz; res.w = 1.0; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ technique MultiLUT { pass MultiLUT_Apply { VertexShader = PostProcessVS; PixelShader = PS_MultiLUT_Apply; } }