Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
显示
视图
拆分
统一
实时编辑器
隐藏空白更改
折叠未更改行
关闭换行
比对精度
智能
语法
无
更改外观
处理
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
AmbientLightDither2017 vs AmbientLightDither2020
创建于
7年前
差异永不过期
清除
导出
分享
解释
35 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
540 行
全部复制
40 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
525 行
全部复制
/**
/**
* Copyright (C) 2015 Ganossa (mediehawk@gmail.com)
* Copyright (C) 2015 Ganossa (mediehawk@gmail.com)
*
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* this software and associated documentation files (the "Software"), to deal in
* the Software with restriction, including without limitation the rights to
* the Software with restriction, including without limitation the rights to
* use and/or sell copies of the Software, and to permit persons to whom the Software
* use and/or sell copies of the Software, and to permit persons to whom the Software
* is furnished to do so, subject to the following conditions:
* is furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and the permission notices (this and below) shall
* The above copyright notice and the permission notices (this and below) shall
* be included in all copies or substantial portions of the Software.
* be included in all copies or substantial portions of the Software.
*
*
* Permission needs to be specifically granted by the author of the software to any
* Permission needs to be specifically granted by the author of the software to any
* person obtaining a copy of this software and associated documentation files
* person obtaining a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction, including without
* (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to copy, modify, merge, publish, distribute, and/or
* limitation the rights to copy, modify, merge, publish, distribute, and/or
* sublicense the Software, and subject to the following conditions:
* sublicense the Software, and subject to the following conditions:
*
*
* The above copyright notice and the permission notices (this and above) shall
* The above copyright notice and the permission notices (this and above) shall
* be included in all copies or substantial portions of the Software.
* be included in all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* SOFTWARE.
*/
*/
/**
/**
* This version of AmbientLight.fx has been modified to allow the "dither" effect
* This version of AmbientLight.fx has been modified to allow the "dither" effect
* to be toggled on and off.
* to be toggled on and off.
*/
*/
复制
已复制
复制
已复制
#include "ReShadeUI.fxh"
uniform bool alDebug <
uniform bool alDebug <
ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation";
ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation";
> = false;
> = false;
复制
已复制
复制
已复制
uniform float alInt <
uniform float alInt <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 20.0;
ui_min = 0.0; ui_max = 20.0;
ui_tooltip = "Base intensity of AL";
ui_tooltip = "Base intensity of AL";
> = 10.15;
> = 10.15;
复制
已复制
复制
已复制
uniform float alThreshold <
uniform float alThreshold <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 100.0;
ui_min = 0.0; ui_max = 100.0;
ui_tooltip = "Reduces intensity for not bright light";
ui_tooltip = "Reduces intensity for not bright light";
> = 15.00;
> = 15.00;
uniform bool AL_Dither <
uniform bool AL_Dither <
ui_tooltip = "Applies dither - may cause diagonal stripes";
ui_tooltip = "Applies dither - may cause diagonal stripes";
> = true;
> = true;
uniform bool AL_Adaptation <
uniform bool AL_Adaptation <
ui_tooltip = "Activates adaptation algorithm";
ui_tooltip = "Activates adaptation algorithm";
> = true;
> = true;
复制
已复制
复制
已复制
uniform float alAdapt <
uniform float alAdapt <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 4.0;
ui_min = 0.0; ui_max = 4.0;
ui_tooltip = "Intensity of AL correction for bright light";
ui_tooltip = "Intensity of AL correction for bright light";
> = 0.70;
> = 0.70;
复制
已复制
复制
已复制
uniform float alAdaptBaseMult <
uniform float alAdaptBaseMult <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 4.0;
ui_min = 0.0; ui_max = 4.0;
ui_tooltip = "Multiplier for adaption applied to the original image";
ui_tooltip = "Multiplier for adaption applied to the original image";
> = 1.00;
> = 1.00;
复制
已复制
复制
已复制
uniform int alAdaptBaseBlackLvL <
uniform int alAdaptBaseBlackLvL <
__UNIFORM_SLIDER_INT1
ui_type = "drag";
ui_min = 0; ui_max = 4;
ui_min = 0; ui_max = 4;
ui_tooltip = "Distinction level of black and white (lower => less distinct)";
ui_tooltip = "Distinction level of black and white (lower => less distinct)";
> = 2;
> = 2;
uniform bool AL_Dirt <
uniform bool AL_Dirt <
> = true;
> = true;
uniform bool AL_DirtTex <
uniform bool AL_DirtTex <
ui_tooltip = "Defines if dirt texture is used as overlay";
ui_tooltip = "Defines if dirt texture is used as overlay";
> = false;
> = false;
uniform bool AL_Vibrance <
uniform bool AL_Vibrance <
ui_tooltip = "Vibrance of dirt effect";
ui_tooltip = "Vibrance of dirt effect";
> = false;
> = false;
uniform int AL_Adaptive <
uniform int AL_Adaptive <
ui_type = "combo";
ui_type = "combo";
ui_min = 0; ui_max = 2;
ui_min = 0; ui_max = 2;
ui_items = "Warm\0Cold\0Light Dependent\0";
ui_items = "Warm\0Cold\0Light Dependent\0";
> = 0;
> = 0;
复制
已复制
复制
已复制
uniform float alDirtInt <
uniform float alDirtInt <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 2.0;
ui_min = 0.0; ui_max = 2.0;
ui_tooltip = "Intensity of dirt effect";
ui_tooltip = "Intensity of dirt effect";
> = 1.0;
> = 1.0;
复制
已复制
复制
已复制
uniform float alDirtOVInt <
uniform float alDirtOVInt <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 2.0;
ui_min = 0.0; ui_max = 2.0;
ui_tooltip = "Intensity of colored dirt effect";
ui_tooltip = "Intensity of colored dirt effect";
> = 1.0;
> = 1.0;
uniform bool AL_Lens <
uniform bool AL_Lens <
ui_tooltip = "Lens effect based on AL";
ui_tooltip = "Lens effect based on AL";
> = false;
> = false;
复制
已复制
复制
已复制
uniform float alLensThresh <
uniform float alLensThresh <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 1.0;
ui_min = 0.0; ui_max = 1.0;
ui_tooltip = "Reduces intensity of lens effect for not bright light";
ui_tooltip = "Reduces intensity of lens effect for not bright light";
> = 0.5;
> = 0.5;
复制
已复制
复制
已复制
uniform float alLensInt <
uniform float alLensInt <
__UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 10.0;
ui_min = 0.0; ui_max = 10.0;
ui_tooltip = "Intensity of lens effect";
ui_tooltip = "Intensity of lens effect";
> = 2.0;
> = 2.0;
已保存差异
原始文本
打开文件
/** * Copyright (C) 2015 Ganossa (mediehawk@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software with restriction, including without limitation the rights to * use and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and the permission notices (this and below) shall * be included in all copies or substantial portions of the Software. * * Permission needs to be specifically granted by the author of the software to any * person obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, including without * limitation the rights to copy, modify, merge, publish, distribute, and/or * sublicense the Software, and subject to the following conditions: * * The above copyright notice and the permission notices (this and above) shall * be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /** * This version of AmbientLight.fx has been modified to allow the "dither" effect * to be toggled on and off. */ uniform bool alDebug < ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation"; > = false; uniform float alInt < ui_type = "drag"; ui_min = 0.0; ui_max = 20.0; ui_tooltip = "Base intensity of AL"; > = 10.15; uniform float alThreshold < ui_type = "drag"; ui_min = 0.0; ui_max = 100.0; ui_tooltip = "Reduces intensity for not bright light"; > = 15.00; uniform bool AL_Dither < ui_tooltip = "Applies dither - may cause diagonal stripes"; > = true; uniform bool AL_Adaptation < ui_tooltip = "Activates adaptation algorithm"; > = true; uniform float alAdapt < ui_type = "drag"; ui_min = 0.0; ui_max = 4.0; ui_tooltip = "Intensity of AL correction for bright light"; > = 0.70; uniform float alAdaptBaseMult < ui_type = "drag"; ui_min = 0.0; ui_max = 4.0; ui_tooltip = "Multiplier for adaption applied to the original image"; > = 1.00; uniform int alAdaptBaseBlackLvL < ui_type = "drag"; ui_min = 0; ui_max = 4; ui_tooltip = "Distinction level of black and white (lower => less distinct)"; > = 2; uniform bool AL_Dirt < > = true; uniform bool AL_DirtTex < ui_tooltip = "Defines if dirt texture is used as overlay"; > = false; uniform bool AL_Vibrance < ui_tooltip = "Vibrance of dirt effect"; > = false; uniform int AL_Adaptive < ui_type = "combo"; ui_min = 0; ui_max = 2; ui_items = "Warm\0Cold\0Light Dependent\0"; > = 0; uniform float alDirtInt < ui_type = "drag"; ui_min = 0.0; ui_max = 2.0; ui_tooltip = "Intensity of dirt effect"; > = 1.0; uniform float alDirtOVInt < ui_type = "drag"; ui_min = 0.0; ui_max = 2.0; ui_tooltip = "Intensity of colored dirt effect"; > = 1.0; uniform bool AL_Lens < ui_tooltip = "Lens effect based on AL"; > = false; uniform float alLensThresh < ui_type = "drag"; ui_min = 0.0; ui_max = 1.0; ui_tooltip = "Reduces intensity of lens effect for not bright light"; > = 0.5; uniform float alLensInt < ui_type = "drag"; ui_min = 0.0; ui_max = 10.0; ui_tooltip = "Intensity of lens effect"; > = 2.0; #include "ReShade.fxh" uniform float2 AL_t < source = "pingpong"; min = 0.0f; max = 6.28f; step = float2(0.1f, 0.2f); >; #define GEMFX_PIXEL_SIZE float2(1.0f / (BUFFER_WIDTH / 16.0f), 1.0f / (BUFFER_HEIGHT / 16.0f)) texture alInTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; }; texture alOutTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; }; texture detectIntTex { Width = 32; Height = 32; Format = RGBA8; }; sampler detectIntColor { Texture = detectIntTex; }; texture detectLowTex { Width = 1; Height = 1; Format = RGBA8; }; sampler detectLowColor { Texture = detectLowTex; }; texture dirtTex < source = "Dirt.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture dirtOVRTex < source = "DirtOVR.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture dirtOVBTex < source = "DirtOVB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDBTex < source = "LensDB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDB2Tex < source = "LensDB2.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDOVTex < source = "LensDOV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDUVTex < source = "LensDUV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; sampler alInColor { Texture = alInTex; }; sampler alOutColor { Texture = alOutTex; }; sampler dirtSampler { Texture = dirtTex; }; sampler dirtOVRSampler { Texture = dirtOVRTex; }; sampler dirtOVBSampler { Texture = dirtOVBTex; }; sampler lensDBSampler { Texture = lensDBTex; }; sampler lensDB2Sampler { Texture = lensDB2Tex; }; sampler lensDOVSampler { Texture = lensDOVTex; }; sampler lensDUVSampler { Texture = lensDUVTex; }; void PS_AL_DetectInt(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectInt : SV_Target0) { detectInt = tex2D(ReShade::BackBuffer, texcoord); } void PS_AL_DetectLow(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectLow : SV_Target0) { detectLow = 0; if (texcoord.x != 0.5 && texcoord.y != 0.5) discard; [loop] for (float i = 0.0; i <= 1; i += 0.03125) { [unroll] for (float j = 0.0; j <= 1; j += 0.03125) { detectLow.xyz += tex2D(detectIntColor, float2(i, j)).xyz; } } detectLow.xyz /= 32 * 32; } void PS_AL_DetectHigh(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 x : SV_Target) { x = tex2D(ReShade::BackBuffer, texcoord); x = float4(x.rgb * pow(abs(max(x.r, max(x.g, x.b))), 2.0), 1.0f); float base = (x.r + x.g + x.b); base /= 3; float nR = (x.r * 2) - base; float nG = (x.g * 2) - base; float nB = (x.b * 2) - base; [flatten] if (nR < 0) { nG += nR / 2; nB += nR / 2; nR = 0; } [flatten] if (nG < 0) { nB += nG / 2; [flatten] if (nR > -nG / 2) nR += nG / 2; else nR = 0; nG = 0; } [flatten] if (nB < 0) { [flatten] if (nR > -nB / 2) nR += nB / 2; else nR = 0; [flatten] if (nG > -nB / 2) nG += nB / 2; else nG = 0; nB = 0; } [flatten] if (nR > 1) { nG += (nR - 1) / 2; nB += (nR - 1) / 2; nR = 1; } [flatten] if (nG > 1) { nB += (nG - 1) / 2; [flatten] if (nR + (nG - 1) < 1) nR += (nG - 1) / 2; else nR = 1; nG = 1; } [flatten] if (nB > 1) { [flatten] if (nR + (nB - 1) < 1) nR += (nB - 1) / 2; else nR = 1; [flatten] if (nG + (nB - 1) < 1) nG += (nB - 1) / 2; else nG = 1; nB = 1; } x.r = nR; x.g = nG; x.b = nB; } void PS_AL_HGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 hgb : SV_Target) { const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 }; const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 }; hgb = tex2D(alInColor, texcoord) * sampleWeights[0]; hgb = float4(max(hgb.rgb - alThreshold, 0.0), hgb.a); float step = 1.08 + (AL_t.x / 100) * 0.02; [flatten] if ((texcoord.x + sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * step; [flatten] if ((texcoord.x - sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * step; [flatten] if ((texcoord.x + sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * step; [flatten] if ((texcoord.x - sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * step; [flatten] if ((texcoord.x + sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * step; [flatten] if ((texcoord.x - sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * step; [flatten] if ((texcoord.x + sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * step; [flatten] if ((texcoord.x - sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * step; } void PS_AL_VGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 vgb : SV_Target) { const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 }; const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 }; vgb = tex2D(alOutColor, texcoord) * sampleWeights[0]; vgb = float4(max(vgb.rgb - alThreshold, 0.0), vgb.a); float step = 1.08 + (AL_t.x / 100) * 0.02; [flatten] if ((texcoord.y + sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * step; [flatten] if ((texcoord.y - sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * step; [flatten] if ((texcoord.y + sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * step; [flatten] if ((texcoord.y - sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * step; [flatten] if ((texcoord.y + sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * step; [flatten] if ((texcoord.y - sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * step; [flatten] if ((texcoord.y + sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * step; [flatten] if ((texcoord.y - sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * step; } float4 PS_AL_Magic(float4 vpos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 base = tex2D(ReShade::BackBuffer, texcoord); float4 high = tex2D(alInColor, texcoord); float adapt = 0; #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Adaptation) { //DetectLow float4 detectLow = tex2D(detectLowColor, 0.5) / 4.215; float low = sqrt(0.241 * detectLow.r * detectLow.r + 0.691 * detectLow.g * detectLow.g + 0.068 * detectLow.b * detectLow.b); //.DetectLow low = pow(low * 1.25f, 2); adapt = low * (low + 1.0f) * alAdapt * alInt * 5.0f; if (alDebug) { float mod = (texcoord.x * 1000.0f) % 1.001f; //mod = abs(mod - texcoord.x / 4.0f); if (texcoord.y < 0.01f && (texcoord.x < low * 10f && mod < 0.3f)) return float4(1f, 0.5f, 0.3f, 0f); if (texcoord.y > 0.01f && texcoord.y < 0.02f && (texcoord.x < adapt / (alInt * 1.5) && mod < 0.3f)) return float4(0.2f, 1f, 0.5f, 0f); } } high = min(0.0325f, high) * 1.15f; float4 highOrig = high; float2 flipcoord = 1.0f - texcoord; float4 highFlipOrig = tex2D(alInColor, flipcoord); highFlipOrig = min(0.03f, highFlipOrig) * 1.15f; float4 highFlip = highFlipOrig; float4 highLensSrc = high; #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Dirt) { float4 dirt = tex2D(dirtSampler, texcoord); float4 dirtOVR = tex2D(dirtOVRSampler, texcoord); float4 dirtOVB = tex2D(dirtOVBSampler, texcoord); float maxhigh = max(high.r, max(high.g, high.b)); float threshDiff = maxhigh - 3.2f; [flatten] if (threshDiff > 0) { high.r = (high.r / maxhigh) * 3.2f; high.g = (high.g / maxhigh) * 3.2f; high.b = (high.b / maxhigh) * 3.2f; } float4 highDirt = AL_DirtTex ? highOrig * dirt * alDirtInt : highOrig * high * alDirtInt; if (AL_Vibrance) { highDirt *= 1.0f + 0.5f * sin(AL_t.x); } float highMix = highOrig.r + highOrig.g + highOrig.b; float red = highOrig.r / highMix; float green = highOrig.g / highMix; float blue = highOrig.b / highMix; highOrig = highOrig + highDirt; if (AL_Adaptive == 2) { high = high + high * dirtOVR * alDirtOVInt * green; high = high + highDirt; high = high + highOrig * dirtOVB * alDirtOVInt * blue; high = high + highOrig * dirtOVR * alDirtOVInt* red; } else if (AL_Adaptive == 1) { high = high + highDirt; high = high + highOrig * dirtOVB * alDirtOVInt; } else { high = high + highDirt; high = high + highOrig * dirtOVR * alDirtOVInt; } highLensSrc = high * 85f * pow(1.25f - (abs(texcoord.x - 0.5f) + abs(texcoord.y - 0.5f)), 2); } float origBright = max(highLensSrc.r, max(highLensSrc.g, highLensSrc.b)); float maxOrig = max((1.8f * alLensThresh) - pow(origBright * (0.5f - abs(texcoord.x - 0.5f)), 4), 0.0f); float smartWeight = maxOrig * max(abs(flipcoord.x - 0.5f), 0.3f * abs(flipcoord.y - 0.5f)) * (2.2 - 1.2 * (abs(flipcoord.x - 0.5f))) * alLensInt; smartWeight = min(0.85f, max(0, AL_Adaptation ? smartWeight - adapt : smartWeight)); #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Lens) { float4 lensDB = tex2D(lensDBSampler, texcoord); float4 lensDB2 = tex2D(lensDB2Sampler, texcoord); float4 lensDOV = tex2D(lensDOVSampler, texcoord); float4 lensDUV = tex2D(lensDUVSampler, texcoord); float4 highLens = highFlip * lensDB * 0.7f * smartWeight; high += highLens; highLens = highFlipOrig * lensDUV * 1.15f * smartWeight; highFlipOrig += highLens; high += highLens; highLens = highFlipOrig * lensDB2 * 0.7f * smartWeight; highFlipOrig += highLens; high += highLens; highLens = highFlipOrig * lensDOV * 1.15f * smartWeight / 2f + highFlipOrig * smartWeight / 2f; highFlipOrig += highLens; high += highLens; } float dither = 0.15 * (1.0 / (pow(2, 10.0) - 1.0)); dither = lerp(2.0 * dither, -2.0 * dither, frac(dot(texcoord, ReShade::ScreenSize * float2(1.0 / 16.0, 10.0 / 36.0)) + 0.25)); if (all(base.xyz == 1.0)) { return 1.0; } #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Adaptation && AL_Dither) { base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow((1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL))); float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither; float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt)); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix); } if (AL_Adaptation) { base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow((1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL))); float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))); float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt)); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix); } if (AL_Dither) { float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither + adapt; float4 baseSample = lerp(base, highSampleMix, alInt); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix); } float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + adapt; float4 baseSample = lerp(base, highSampleMix, alInt); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix); } technique AmbientLight { pass AL_DetectInt { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectInt; RenderTarget = detectIntTex; } pass AL_DetectLow { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectLow; RenderTarget = detectLowTex; } pass AL_DetectHigh { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectHigh; RenderTarget = alInTex; } #define PASS_AL_H(i) \ pass AL_H##i \ { \ VertexShader = PostProcessVS; \ PixelShader = PS_AL_HGB; \ RenderTarget = alOutTex; \ } #define PASS_AL_V(i) \ pass AL_V##i \ { \ VertexShader = PostProcessVS; \ PixelShader = PS_AL_VGB; \ RenderTarget = alInTex; \ } PASS_AL_H(1) PASS_AL_V(1) PASS_AL_H(2) PASS_AL_V(2) PASS_AL_H(3) PASS_AL_V(3) PASS_AL_H(4) PASS_AL_V(4) PASS_AL_H(5) PASS_AL_V(5) PASS_AL_H(6) PASS_AL_V(6) PASS_AL_H(7) PASS_AL_V(7) PASS_AL_H(8) PASS_AL_V(8) PASS_AL_H(9) PASS_AL_V(9) PASS_AL_H(10) PASS_AL_V(10) PASS_AL_H(11) PASS_AL_V(11) PASS_AL_H(12) PASS_AL_V(12) pass AL_Magic { VertexShader = PostProcessVS; PixelShader = PS_AL_Magic; } }
更改后文本
打开文件
/** * Copyright (C) 2015 Ganossa (mediehawk@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software with restriction, including without limitation the rights to * use and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and the permission notices (this and below) shall * be included in all copies or substantial portions of the Software. * * Permission needs to be specifically granted by the author of the software to any * person obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, including without * limitation the rights to copy, modify, merge, publish, distribute, and/or * sublicense the Software, and subject to the following conditions: * * The above copyright notice and the permission notices (this and above) shall * be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /** * This version of AmbientLight.fx has been modified to allow the "dither" effect * to be toggled on and off. */ #include "ReShadeUI.fxh" uniform bool alDebug < ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation"; > = false; uniform float alInt < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 20.0; ui_tooltip = "Base intensity of AL"; > = 10.15; uniform float alThreshold < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 100.0; ui_tooltip = "Reduces intensity for not bright light"; > = 15.00; uniform bool AL_Dither < ui_tooltip = "Applies dither - may cause diagonal stripes"; > = true; uniform bool AL_Adaptation < ui_tooltip = "Activates adaptation algorithm"; > = true; uniform float alAdapt < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 4.0; ui_tooltip = "Intensity of AL correction for bright light"; > = 0.70; uniform float alAdaptBaseMult < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 4.0; ui_tooltip = "Multiplier for adaption applied to the original image"; > = 1.00; uniform int alAdaptBaseBlackLvL < __UNIFORM_SLIDER_INT1 ui_min = 0; ui_max = 4; ui_tooltip = "Distinction level of black and white (lower => less distinct)"; > = 2; uniform bool AL_Dirt < > = true; uniform bool AL_DirtTex < ui_tooltip = "Defines if dirt texture is used as overlay"; > = false; uniform bool AL_Vibrance < ui_tooltip = "Vibrance of dirt effect"; > = false; uniform int AL_Adaptive < ui_type = "combo"; ui_min = 0; ui_max = 2; ui_items = "Warm\0Cold\0Light Dependent\0"; > = 0; uniform float alDirtInt < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 2.0; ui_tooltip = "Intensity of dirt effect"; > = 1.0; uniform float alDirtOVInt < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 2.0; ui_tooltip = "Intensity of colored dirt effect"; > = 1.0; uniform bool AL_Lens < ui_tooltip = "Lens effect based on AL"; > = false; uniform float alLensThresh < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 1.0; ui_tooltip = "Reduces intensity of lens effect for not bright light"; > = 0.5; uniform float alLensInt < __UNIFORM_SLIDER_FLOAT1 ui_min = 0.0; ui_max = 10.0; ui_tooltip = "Intensity of lens effect"; > = 2.0; #include "ReShade.fxh" uniform float2 AL_t < source = "pingpong"; min = 0.0f; max = 6.28f; step = float2(0.1f, 0.2f); >; #define GEMFX_PIXEL_SIZE float2(1.0f / (BUFFER_WIDTH / 16.0f), 1.0f / (BUFFER_HEIGHT / 16.0f)) texture alInTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; }; texture alOutTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; }; texture detectIntTex { Width = 32; Height = 32; Format = RGBA8; }; sampler detectIntColor { Texture = detectIntTex; }; texture detectLowTex { Width = 1; Height = 1; Format = RGBA8; }; sampler detectLowColor { Texture = detectLowTex; }; texture dirtTex < source = "Dirt.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture dirtOVRTex < source = "DirtOVR.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture dirtOVBTex < source = "DirtOVB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDBTex < source = "LensDB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDB2Tex < source = "LensDB2.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDOVTex < source = "LensDOV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; texture lensDUVTex < source = "LensDUV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; }; sampler alInColor { Texture = alInTex; }; sampler alOutColor { Texture = alOutTex; }; sampler dirtSampler { Texture = dirtTex; }; sampler dirtOVRSampler { Texture = dirtOVRTex; }; sampler dirtOVBSampler { Texture = dirtOVBTex; }; sampler lensDBSampler { Texture = lensDBTex; }; sampler lensDB2Sampler { Texture = lensDB2Tex; }; sampler lensDOVSampler { Texture = lensDOVTex; }; sampler lensDUVSampler { Texture = lensDUVTex; }; void PS_AL_DetectInt(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectInt : SV_Target0) { detectInt = tex2D(ReShade::BackBuffer, texcoord); } void PS_AL_DetectLow(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectLow : SV_Target0) { detectLow = 0; if (texcoord.x != 0.5 && texcoord.y != 0.5) discard; [loop] for (float i = 0.0; i <= 1; i += 0.03125) { [unroll] for (float j = 0.0; j <= 1; j += 0.03125) { detectLow.xyz += tex2D(detectIntColor, float2(i, j)).xyz; } } detectLow.xyz /= 32 * 32; } void PS_AL_DetectHigh(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 x : SV_Target) { x = tex2D(ReShade::BackBuffer, texcoord); x = float4(x.rgb * pow(abs(max(x.r, max(x.g, x.b))), 2.0), 1.0f); float base = (x.r + x.g + x.b); base /= 3; float nR = (x.r * 2) - base; float nG = (x.g * 2) - base; float nB = (x.b * 2) - base; [flatten] if (nR < 0) { nG += nR / 2; nB += nR / 2; nR = 0; } [flatten] if (nG < 0) { nB += nG / 2; [flatten] if (nR > -nG / 2) nR += nG / 2; else nR = 0; nG = 0; } [flatten] if (nB < 0) { [flatten] if (nR > -nB / 2) nR += nB / 2; else nR = 0; [flatten] if (nG > -nB / 2) nG += nB / 2; else nG = 0; nB = 0; } [flatten] if (nR > 1) { nG += (nR - 1) / 2; nB += (nR - 1) / 2; nR = 1; } [flatten] if (nG > 1) { nB += (nG - 1) / 2; [flatten] if (nR + (nG - 1) < 1) nR += (nG - 1) / 2; else nR = 1; nG = 1; } [flatten] if (nB > 1) { [flatten] if (nR + (nB - 1) < 1) nR += (nB - 1) / 2; else nR = 1; [flatten] if (nG + (nB - 1) < 1) nG += (nB - 1) / 2; else nG = 1; nB = 1; } x.r = nR; x.g = nG; x.b = nB; } void PS_AL_HGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 hgb : SV_Target) { const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 }; const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 }; hgb = tex2D(alInColor, texcoord) * sampleWeights[0]; hgb = float4(max(hgb.rgb - alThreshold, 0.0), hgb.a); float stepMult = 1.08 + (AL_t.x / 100) * 0.02; [flatten] if ((texcoord.x + sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * stepMult; [flatten] if ((texcoord.x - sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * stepMult; [flatten] if ((texcoord.x + sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * stepMult; [flatten] if ((texcoord.x - sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * stepMult; [flatten] if ((texcoord.x + sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * stepMult; [flatten] if ((texcoord.x - sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * stepMult; [flatten] if ((texcoord.x + sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) < 1.05) hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * stepMult; [flatten] if ((texcoord.x - sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) > -0.05) hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * stepMult; } void PS_AL_VGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 vgb : SV_Target) { const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 }; const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 }; vgb = tex2D(alOutColor, texcoord) * sampleWeights[0]; vgb = float4(max(vgb.rgb - alThreshold, 0.0), vgb.a); float stepMult = 1.08 + (AL_t.x / 100) * 0.02; [flatten] if ((texcoord.y + sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * stepMult; [flatten] if ((texcoord.y - sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * stepMult; [flatten] if ((texcoord.y + sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * stepMult; [flatten] if ((texcoord.y - sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * stepMult; [flatten] if ((texcoord.y + sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * stepMult; [flatten] if ((texcoord.y - sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * stepMult; [flatten] if ((texcoord.y + sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) < 1.05) vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * stepMult; [flatten] if ((texcoord.y - sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) > -0.05) vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * stepMult; } float4 PS_AL_Magic(float4 vpos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target { float4 base = tex2D(ReShade::BackBuffer, texcoord); float4 high = tex2D(alInColor, texcoord); float adapt = 0; #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Adaptation) { //DetectLow float4 detectLow = tex2D(detectLowColor, 0.5) / 4.215; float low = sqrt(0.241 * detectLow.r * detectLow.r + 0.691 * detectLow.g * detectLow.g + 0.068 * detectLow.b * detectLow.b); //.DetectLow low = pow(low * 1.25f, 2); adapt = low * (low + 1.0f) * alAdapt * alInt * 5.0f; if (alDebug) { float mod = (texcoord.x * 1000.0f) % 1.001f; //mod = abs(mod - texcoord.x / 4.0f); if (texcoord.y < 0.01f && (texcoord.x < low * 10f && mod < 0.3f)) return float4(1f, 0.5f, 0.3f, 0f); if (texcoord.y > 0.01f && texcoord.y < 0.02f && (texcoord.x < adapt / (alInt * 1.5) && mod < 0.3f)) return float4(0.2f, 1f, 0.5f, 0f); } } high = min(0.0325f, high) * 1.15f; float4 highOrig = high; float2 flipcoord = 1.0f - texcoord; float4 highFlipOrig = tex2D(alInColor, flipcoord); highFlipOrig = min(0.03f, highFlipOrig) * 1.15f; float4 highFlip = highFlipOrig; float4 highLensSrc = high; #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Dirt) { float4 dirt = tex2D(dirtSampler, texcoord); float4 dirtOVR = tex2D(dirtOVRSampler, texcoord); float4 dirtOVB = tex2D(dirtOVBSampler, texcoord); float maxhigh = max(high.r, max(high.g, high.b)); float threshDiff = maxhigh - 3.2f; [flatten] if (threshDiff > 0) { high.r = (high.r / maxhigh) * 3.2f; high.g = (high.g / maxhigh) * 3.2f; high.b = (high.b / maxhigh) * 3.2f; } float4 highDirt = AL_DirtTex ? highOrig * dirt * alDirtInt : highOrig * high * alDirtInt; if (AL_Vibrance) { highDirt *= 1.0f + 0.5f * sin(AL_t.x); } float highMix = highOrig.r + highOrig.g + highOrig.b; float red = highOrig.r / highMix; float green = highOrig.g / highMix; float blue = highOrig.b / highMix; highOrig = highOrig + highDirt; if (AL_Adaptive == 2) { high = high + high * dirtOVR * alDirtOVInt * green; high = high + highDirt; high = high + highOrig * dirtOVB * alDirtOVInt * blue; high = high + highOrig * dirtOVR * alDirtOVInt* red; } else if (AL_Adaptive == 1) { high = high + highDirt; high = high + highOrig * dirtOVB * alDirtOVInt; } else { high = high + highDirt; high = high + highOrig * dirtOVR * alDirtOVInt; } highLensSrc = high * 85f * pow(1.25f - (abs(texcoord.x - 0.5f) + abs(texcoord.y - 0.5f)), 2); } float origBright = max(highLensSrc.r, max(highLensSrc.g, highLensSrc.b)); float maxOrig = max((1.8f * alLensThresh) - pow(origBright * (0.5f - abs(texcoord.x - 0.5f)), 4), 0.0f); float smartWeight = maxOrig * max(abs(flipcoord.x - 0.5f), 0.3f * abs(flipcoord.y - 0.5f)) * (2.2 - 1.2 * (abs(flipcoord.x - 0.5f))) * alLensInt; smartWeight = min(0.85f, max(0, AL_Adaptation ? smartWeight - adapt : smartWeight)); #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Lens) { float4 lensDB = tex2D(lensDBSampler, texcoord); float4 lensDB2 = tex2D(lensDB2Sampler, texcoord); float4 lensDOV = tex2D(lensDOVSampler, texcoord); float4 lensDUV = tex2D(lensDUVSampler, texcoord); float4 highLens = highFlip * lensDB * 0.7f * smartWeight; high += highLens; highLens = highFlipOrig * lensDUV * 1.15f * smartWeight; highFlipOrig += highLens; high += highLens; highLens = highFlipOrig * lensDB2 * 0.7f * smartWeight; highFlipOrig += highLens; high += highLens; highLens = highFlipOrig * lensDOV * 1.15f * smartWeight / 2f + highFlipOrig * smartWeight / 2f; highFlipOrig += highLens; high += highLens; } float dither = 0.15 * (1.0 / (pow(2, 10.0) - 1.0)); dither = lerp(2.0 * dither, -2.0 * dither, frac(dot(texcoord, BUFFER_SCREEN_SIZE * float2(1.0 / 16.0, 10.0 / 36.0)) + 0.25)); if (all(base.xyz == 1.0)) { return 1.0; } #if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__ [flatten] #endif if (AL_Adaptation && AL_Dither) { base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow(abs(1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL))); float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither; float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt)); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix); } else if (AL_Adaptation) { base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow(abs(1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL))); float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))); float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt)); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix); } else if (AL_Dither) { float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither + adapt; float4 baseSample = lerp(base, highSampleMix, alInt); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix); } else { float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + adapt; float4 baseSample = lerp(base, highSampleMix, alInt); float baseSampleMix = baseSample.r + baseSample.g + baseSample.b; return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix); } } technique AmbientLight { pass AL_DetectInt { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectInt; RenderTarget = detectIntTex; } pass AL_DetectLow { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectLow; RenderTarget = detectLowTex; } pass AL_DetectHigh { VertexShader = PostProcessVS; PixelShader = PS_AL_DetectHigh; RenderTarget = alInTex; } #define PASS_AL_H(i) \ pass AL_H##i \ { \ VertexShader = PostProcessVS; \ PixelShader = PS_AL_HGB; \ RenderTarget = alOutTex; \ } #define PASS_AL_V(i) \ pass AL_V##i \ { \ VertexShader = PostProcessVS; \ PixelShader = PS_AL_VGB; \ RenderTarget = alInTex; \ } PASS_AL_H(1) PASS_AL_V(1) PASS_AL_H(2) PASS_AL_V(2) PASS_AL_H(3) PASS_AL_V(3) PASS_AL_H(4) PASS_AL_V(4) PASS_AL_H(5) PASS_AL_V(5) PASS_AL_H(6) PASS_AL_V(6) PASS_AL_H(7) PASS_AL_V(7) PASS_AL_H(8) PASS_AL_V(8) PASS_AL_H(9) PASS_AL_V(9) PASS_AL_H(10) PASS_AL_V(10) PASS_AL_H(11) PASS_AL_V(11) PASS_AL_H(12) PASS_AL_V(12) pass AL_Magic { VertexShader = PostProcessVS; PixelShader = PS_AL_Magic; } }
查找差异