mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-20 20:05:33 +00:00
mipwork, laregly courtesy of @mmarauder2k9-torque
This commit is contained in:
parent
81504fb089
commit
cacd8a6064
8 changed files with 128 additions and 128 deletions
|
|
@ -117,8 +117,7 @@ singleton ShaderData( HDR_BloomUpSampleShader )
|
|||
OGLVertexShaderFile= $Core::CommonShaderPath @ "/postFX/gl/postFxV.glsl";
|
||||
OGLPixelShaderFile = "./HDR_Bloom/upSampleP.glsl";
|
||||
|
||||
samplerNames[0] = "$nxtTex";
|
||||
samplerNames[1] = "$mipTex";
|
||||
samplerNames[0] = "$hdrbloomDown";
|
||||
|
||||
pixVersion = 3.0;
|
||||
};
|
||||
|
|
@ -292,13 +291,7 @@ function HDRPostFX::setShaderConsts( %this )
|
|||
%bloom.skip = (!$PostFX::HDRPostFX::enableBloom || !$pref::PostFX::EnableHDRBloom);
|
||||
|
||||
%bloom.setShaderConst("$threshold", $PostFX::HDRPostFX::threshold);
|
||||
|
||||
for (%idx = 0; %idx < %this.mipsCount; %idx++)
|
||||
{
|
||||
%mip = %bloom.getObject(%this.mipsCount + %idx);
|
||||
%mip.setShaderConst("$filterRadius", $PostFX::HDRPostFX::radius);
|
||||
%mip.setShaderConst("$mipId", %idx);
|
||||
}
|
||||
%bloom-->upFX.setShaderConst("$filterRadius", $PostFX::HDRPostFX::radius);
|
||||
|
||||
%strength = $PostFX::HDRPostFX::intensity;
|
||||
if (!$PostFX::HDRPostFX::enableBloom || !$pref::PostFX::EnableHDRBloom)
|
||||
|
|
@ -524,50 +517,36 @@ function HDRPostFX::SetupBloomFX( %this )
|
|||
shader = HDR_BloomThresholdShader;
|
||||
stateBlock = HDR_DownSampleStateBlock;
|
||||
texture[0] = "#hdrInitBloom";
|
||||
target = "#hdrbloom_0";
|
||||
target = "#hdrbloomIn";
|
||||
mipCap = "5";
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
|
||||
%textureName = "#hdrbloom_0";
|
||||
for (%idx = 0; %idx < %this.mipsCount; %idx++)
|
||||
{
|
||||
%mipName = "hdrbloom_" @ (%idx + 1);
|
||||
%mipFX = new PostEffect()
|
||||
{
|
||||
internalName = %mipName;
|
||||
allowReflectPass = false;
|
||||
shader = HDR_BloomDownSampleShader;
|
||||
stateBlock = HDR_DownSampleStateBlock;
|
||||
texture[0] = %textureName;
|
||||
target = "#" @ %mipName;
|
||||
targetScale = "0.5 0.5";
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
|
||||
%bloomFX.add(%mipFX);
|
||||
%textureName = "#" @ %mipName;
|
||||
}
|
||||
|
||||
for (%idx = %this.mipsCount - 1; %idx >= 0; %idx--)
|
||||
%downFX = new PostEffect()
|
||||
{
|
||||
%nxt = "#hdrbloom_" @ %idx;
|
||||
%mipName = "hdrbloom_up_" @ %idx;
|
||||
|
||||
%mipFX = new PostEffect()
|
||||
{
|
||||
internalName = %mipName;
|
||||
allowReflectPass = false;
|
||||
shader = HDR_BloomUpSampleShader;
|
||||
stateBlock = HDR_DownSampleStateBlock;
|
||||
texture[0] = %nxt;
|
||||
texture[1] = %textureName;
|
||||
target = "#" @ %mipName;
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
|
||||
%bloomFX.add(%mipFX);
|
||||
%textureName = "#" @ %mipName;
|
||||
}
|
||||
internalName = "downFX";
|
||||
allowReflectPass = false;
|
||||
shader = HDR_BloomDownSampleShader;
|
||||
stateBlock = HDR_DownSampleStateBlock;
|
||||
texture[0] = "#hdrbloomIn";
|
||||
target = "#hdrbloomDown";
|
||||
mipCap = "5";
|
||||
targetScale = "0.5 0.5";
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
%bloomFX.add(%downFX);
|
||||
|
||||
%upFX = new PostEffect()
|
||||
{
|
||||
internalName = "upFX";
|
||||
allowReflectPass = false;
|
||||
shader = HDR_BloomUpSampleShader;
|
||||
stateBlock = HDR_DownSampleStateBlock;
|
||||
texture[0] = "#hdrbloomDown";
|
||||
target = "#hdrbloomUp";
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
%bloomFX.add(%upFX);
|
||||
|
||||
%finalFX = new PostEffect()
|
||||
{
|
||||
|
|
@ -575,7 +554,7 @@ function HDRPostFX::SetupBloomFX( %this )
|
|||
allowReflectPass = false;
|
||||
shader = HDR_BloomDirtShader;
|
||||
stateBlock = HDR_LensDirtStateBlock;
|
||||
texture[0] = "#hdrbloom_up_0";
|
||||
texture[0] = "#hdrbloomUp";
|
||||
target = "#hdrbloom_end";
|
||||
targetFormat = %this.mipTexFormat;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
TORQUE_UNIFORM_SAMPLER2D(inputTex, 0);
|
||||
uniform float2 oneOverTargetSize;
|
||||
uniform int mipId;
|
||||
uniform int mipCount0;
|
||||
|
||||
float4 main(PFXVertToPix IN) : TORQUE_TARGET0
|
||||
{
|
||||
|
|
@ -33,49 +33,51 @@ float4 main(PFXVertToPix IN) : TORQUE_TARGET0
|
|||
float x = oneOverTargetSize.x;
|
||||
float y = oneOverTargetSize.y;
|
||||
|
||||
float3 a = TORQUE_TEX2D(inputTex, float2(IN.uv0.x - 2 * x, IN.uv0.y + 2*y)).rgb;
|
||||
float3 b = TORQUE_TEX2D(inputTex, float2(IN.uv0.x , IN.uv0.y + 2*y)).rgb;
|
||||
float3 c = TORQUE_TEX2D(inputTex, float2(IN.uv0.x + 2 * x, IN.uv0.y + 2*y)).rgb;
|
||||
|
||||
float3 d = TORQUE_TEX2D(inputTex, float2(IN.uv0.x - 2 * x, IN.uv0.y)).rgb;
|
||||
float3 e = TORQUE_TEX2D(inputTex, float2(IN.uv0.x , IN.uv0.y)).rgb;
|
||||
float3 f = TORQUE_TEX2D(inputTex, float2(IN.uv0.x + 2 * x, IN.uv0.y)).rgb;
|
||||
|
||||
float3 g = TORQUE_TEX2D(inputTex, float2(IN.uv0.x - 2 * x, IN.uv0.y - 2*y)).rgb;
|
||||
float3 h = TORQUE_TEX2D(inputTex, float2(IN.uv0.x , IN.uv0.y - 2*y)).rgb;
|
||||
float3 i = TORQUE_TEX2D(inputTex, float2(IN.uv0.x + 2 * x, IN.uv0.y - 2*y)).rgb;
|
||||
|
||||
float3 j = TORQUE_TEX2D(inputTex, float2(IN.uv0.x - x, IN.uv0.y + y)).rgb;
|
||||
float3 k = TORQUE_TEX2D(inputTex, float2(IN.uv0.x + x, IN.uv0.y + y)).rgb;
|
||||
float3 l = TORQUE_TEX2D(inputTex, float2(IN.uv0.x - x, IN.uv0.y - y)).rgb;
|
||||
float3 m = TORQUE_TEX2D(inputTex, float2(IN.uv0.x + x, IN.uv0.y - y)).rgb;
|
||||
|
||||
float3 group[5];
|
||||
switch (mipId)
|
||||
for (int mipId = 0; mipId<mipCount0; mipId++)
|
||||
{
|
||||
case 0:
|
||||
group[0] = (a+b+d+e) * (0.125f/4.0f);
|
||||
group[1] = (b+c+e+f) * (0.125f/4.0f);
|
||||
group[2] = (d+e+g+h) * (0.125f/4.0f);
|
||||
group[3] = (e+f+h+i) * (0.125f/4.0f);
|
||||
group[4] = (j+k+l+m) * (0.5f/4.0f);
|
||||
group[0] *= KarisAverage(group[0]);
|
||||
group[1] *= KarisAverage(group[1]);
|
||||
group[2] *= KarisAverage(group[2]);
|
||||
group[3] *= KarisAverage(group[3]);
|
||||
group[4] *= KarisAverage(group[4]);
|
||||
downSample.rgb = group[0]+group[1]+group[2]+group[3]+group[4];
|
||||
downSample.a = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
downSample.rgb = e*0.125;
|
||||
downSample.rgb += (a+c+g+i)*0.03125;
|
||||
downSample.rgb += (b+d+f+h)*0.0625;
|
||||
downSample.rgb += (j+k+l+m)*0.125;
|
||||
downSample.a = 1.0;
|
||||
break;
|
||||
}
|
||||
float3 a = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - 2 * x, IN.uv0.y + 2*y, 0, mipId)).rgb;
|
||||
float3 b = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x , IN.uv0.y + 2*y, 0, mipId)).rgb;
|
||||
float3 c = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + 2 * x, IN.uv0.y + 2*y, 0, mipId)).rgb;
|
||||
|
||||
float3 d = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - 2 * x, IN.uv0.y, 0, mipId)).rgb;
|
||||
float3 e = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x , IN.uv0.y, 0, mipId)).rgb;
|
||||
float3 f = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + 2 * x, IN.uv0.y, 0, mipId)).rgb;
|
||||
|
||||
float3 g = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - 2 * x, IN.uv0.y - 2*y, 0, mipId)).rgb;
|
||||
float3 h = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x , IN.uv0.y - 2*y, 0, mipId)).rgb;
|
||||
float3 i = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + 2 * x, IN.uv0.y - 2*y, 0, mipId)).rgb;
|
||||
|
||||
float3 j = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - x, IN.uv0.y + y, 0, mipId)).rgb;
|
||||
float3 k = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + x, IN.uv0.y + y, 0, mipId)).rgb;
|
||||
float3 l = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x - x, IN.uv0.y - y, 0, mipId)).rgb;
|
||||
float3 m = TORQUE_TEX2DLOD(inputTex, float4(IN.uv0.x + x, IN.uv0.y - y, 0, mipId)).rgb;
|
||||
|
||||
float3 group[5];
|
||||
switch (mipId)
|
||||
{
|
||||
case 0:
|
||||
group[0] = (a+b+d+e) * (0.125f/4.0f);
|
||||
group[1] = (b+c+e+f) * (0.125f/4.0f);
|
||||
group[2] = (d+e+g+h) * (0.125f/4.0f);
|
||||
group[3] = (e+f+h+i) * (0.125f/4.0f);
|
||||
group[4] = (j+k+l+m) * (0.5f/4.0f);
|
||||
group[0] *= KarisAverage(group[0]);
|
||||
group[1] *= KarisAverage(group[1]);
|
||||
group[2] *= KarisAverage(group[2]);
|
||||
group[3] *= KarisAverage(group[3]);
|
||||
group[4] *= KarisAverage(group[4]);
|
||||
downSample.rgb = group[0]+group[1]+group[2]+group[3]+group[4];
|
||||
downSample.a = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
downSample.rgb = e*0.125;
|
||||
downSample.rgb += (a+c+g+i)*0.03125;
|
||||
downSample.rgb += (b+d+f+h)*0.0625;
|
||||
downSample.rgb += (j+k+l+m)*0.125;
|
||||
downSample.a = 1.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return downSample;
|
||||
}
|
||||
|
|
@ -22,36 +22,39 @@
|
|||
|
||||
#include "core/rendering/shaders/postFX/postFx.hlsl"
|
||||
|
||||
TORQUE_UNIFORM_SAMPLER2D(nxtTex, 0);
|
||||
TORQUE_UNIFORM_SAMPLER2D(mipTex, 1);
|
||||
TORQUE_UNIFORM_SAMPLER2D(hdrbloomDown, 0);
|
||||
uniform float filterRadius;
|
||||
uniform float2 oneOverTargetSize;
|
||||
uniform int mipCount0;
|
||||
|
||||
float4 main(PFXVertToPix IN) : TORQUE_TARGET0
|
||||
{
|
||||
float4 upSample = float4(0, 0, 0, 0);
|
||||
float x = filterRadius*oneOverTargetSize.x;
|
||||
float y = filterRadius*oneOverTargetSize.y;
|
||||
float4 finalOut = float4(0, 0, 0, 0);
|
||||
for (int mipId = 0; mipId<mipCount0; mipId++)
|
||||
{
|
||||
float x = filterRadius*oneOverTargetSize.x;
|
||||
float y = filterRadius*oneOverTargetSize.y;
|
||||
|
||||
float3 a = TORQUE_TEX2D(mipTex, float2(IN.uv1.x - x, IN.uv1.y + y)).rgb;
|
||||
float3 b = TORQUE_TEX2D(mipTex, float2(IN.uv1.x, IN.uv1.y + y)).rgb;
|
||||
float3 c = TORQUE_TEX2D(mipTex, float2(IN.uv1.x + x, IN.uv1.y + y)).rgb;
|
||||
float3 a = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y + y, 0, mipId)).rgb;
|
||||
float3 b = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x, IN.uv1.y + y, 0, mipId)).rgb;
|
||||
float3 c = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y + y, 0, mipId)).rgb;
|
||||
|
||||
float3 d = TORQUE_TEX2D(mipTex, float2(IN.uv1.x - x, IN.uv1.y)).rgb;
|
||||
float3 e = TORQUE_TEX2D(mipTex, float2(IN.uv1.x, IN.uv1.y)).rgb;
|
||||
float3 f = TORQUE_TEX2D(mipTex, float2(IN.uv1.x + x, IN.uv1.y)).rgb;
|
||||
float3 d = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y, 0, mipId)).rgb;
|
||||
float3 e = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x, IN.uv1.y, 0, mipId)).rgb;
|
||||
float3 f = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y, 0, mipId)).rgb;
|
||||
|
||||
float3 g = TORQUE_TEX2D(mipTex, float2(IN.uv1.x - x, IN.uv1.y - y)).rgb;
|
||||
float3 h = TORQUE_TEX2D(mipTex, float2(IN.uv1.x, IN.uv1.y - y)).rgb;
|
||||
float3 i = TORQUE_TEX2D(mipTex, float2(IN.uv1.x + x, IN.uv1.y - y)).rgb;
|
||||
float3 g = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x - x, IN.uv1.y - y, 0, mipId)).rgb;
|
||||
float3 h = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x, IN.uv1.y - y, 0, mipId)).rgb;
|
||||
float3 i = TORQUE_TEX2DLOD(hdrbloomDown, float4(IN.uv1.x + x, IN.uv1.y - y, 0, mipId)).rgb;
|
||||
|
||||
upSample.rgb = e*4.0;
|
||||
upSample.rgb += (b+d+f+h)*2.0;
|
||||
upSample.rgb += (a+c+g+i);
|
||||
upSample.rgb *= 1.0 / 16.0;
|
||||
upSample.a = 1.0;
|
||||
|
||||
upSample = TORQUE_TEX2D(nxtTex, IN.uv0) + upSample;
|
||||
|
||||
return upSample;
|
||||
upSample.rgb = e*4.0;
|
||||
upSample.rgb += (b+d+f+h)*2.0;
|
||||
upSample.rgb += (a+c+g+i);
|
||||
upSample.rgb *= 1.0 / 16.0;
|
||||
upSample.a = 1.0;
|
||||
finalOut += upSample;
|
||||
}
|
||||
finalOut.a = 1.0;
|
||||
return float4(finalOut.r,0,0,1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue