Refactoring (nw)

- restructured bloom level size and weight uniforms
master
ImJezze 2016-01-03 16:20:27 +01:00
parent a2c7b61daa
commit 1cacb7d040
4 changed files with 105 additions and 120 deletions

View File

@ -149,17 +149,17 @@ struct VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR0;
float4 TexCoord01 : TEXCOORD0;
float4 TexCoord23 : TEXCOORD1;
float4 TexCoord45 : TEXCOORD2;
float4 TexCoord67 : TEXCOORD3;
float4 TexCoord89 : TEXCOORD4;
float2 TexCoordA : TEXCOORD5;
float2 TexCoord0 : TEXCOORD0;
float4 TexCoord12 : TEXCOORD1;
float4 TexCoord34 : TEXCOORD2;
float4 TexCoord56 : TEXCOORD3;
float4 TexCoord78 : TEXCOORD4;
float4 TexCoord9A : TEXCOORD5;
};
struct VS_INPUT
{
float3 Position : POSITION;
float4 Position : POSITION;
float4 Color : COLOR0;
float2 TexCoord : TEXCOORD0;
};
@ -167,12 +167,12 @@ struct VS_INPUT
struct PS_INPUT
{
float4 Color : COLOR0;
float4 TexCoord01 : TEXCOORD0;
float4 TexCoord23 : TEXCOORD1;
float4 TexCoord45 : TEXCOORD2;
float4 TexCoord67 : TEXCOORD3;
float4 TexCoord89 : TEXCOORD4;
float2 TexCoordA : TEXCOORD5;
float2 TexCoord0 : TEXCOORD0;
float4 TexCoord12 : TEXCOORD1;
float4 TexCoord34 : TEXCOORD2;
float4 TexCoord56 : TEXCOORD3;
float4 TexCoord78 : TEXCOORD4;
float4 TexCoord9A : TEXCOORD5;
};
//-----------------------------------------------------------------------------
@ -202,13 +202,14 @@ float random(float2 seed)
uniform float2 ScreenDims;
uniform float2 TargetDims;
uniform float2 SourceRect;
uniform float4 Level01Size;
uniform float4 Level23Size;
uniform float4 Level45Size;
uniform float4 Level67Size;
uniform float4 Level89Size;
uniform float2 LevelASize;
uniform float2 Level0Size;
uniform float4 Level12Size;
uniform float4 Level34Size;
uniform float4 Level56Size;
uniform float4 Level78Size;
uniform float4 Level9ASize;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@ -225,13 +226,12 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float2 TexCoord = Input.Position.xy / ScreenDims;
TexCoord += 0.5f / TargetDims; // half texel offset correction (DX9)
Output.TexCoord01.xy = TexCoord.xy;
Output.TexCoord01.zw = TexCoord.xy + 0.5f / Level01Size.zw;
Output.TexCoord23 = TexCoord.xyxy + 0.5f / Level23Size;
Output.TexCoord45 = TexCoord.xyxy + 0.5f / Level45Size;
Output.TexCoord67 = TexCoord.xyxy + 0.5f / Level67Size;
Output.TexCoord89 = TexCoord.xyxy + 0.5f / Level89Size;
Output.TexCoordA = TexCoord.xy + 0.5f / LevelASize;
Output.TexCoord0 = TexCoord;
Output.TexCoord12 = TexCoord.xyxy + (0.5f / Level12Size);
Output.TexCoord34 = TexCoord.xyxy + (0.5f / Level34Size);
Output.TexCoord56 = TexCoord.xyxy + (0.5f / Level56Size);
Output.TexCoord78 = TexCoord.xyxy + (0.5f / Level78Size);
Output.TexCoord9A = TexCoord.xyxy + (0.5f / Level9ASize);
return Output;
}
@ -240,11 +240,14 @@ VS_OUTPUT vs_main(VS_INPUT Input)
// Bloom Pixel Shader
//-----------------------------------------------------------------------------
uniform float4 Level0123Weight;
uniform float4 Level4567Weight;
uniform float3 Level89AWeight;
uniform float Level0Weight;
uniform float2 Level12Weight;
uniform float2 Level34Weight;
uniform float2 Level56Weight;
uniform float2 Level78Weight;
uniform float2 Level9AWeight;
uniform int BloomBlendMode = 1; // 0 addition, 1 darken
uniform int BloomBlendMode = 0; // 0 addition, 1 darken
uniform float BloomScale;
uniform float3 BloomOverdrive;
@ -256,34 +259,34 @@ float3 GetNoiseFactor(float3 n, float random)
float4 ps_main(PS_INPUT Input) : COLOR
{
float3 texel0 = tex2D(DiffuseSampler0, Input.TexCoord01.xy).rgb;
float3 texel1 = tex2D(DiffuseSampler1, Input.TexCoord01.zw).rgb;
float3 texel2 = tex2D(DiffuseSampler2, Input.TexCoord23.xy).rgb;
float3 texel3 = tex2D(DiffuseSampler3, Input.TexCoord23.zw).rgb;
float3 texel4 = tex2D(DiffuseSampler4, Input.TexCoord45.xy).rgb;
float3 texel5 = tex2D(DiffuseSampler5, Input.TexCoord45.zw).rgb;
float3 texel6 = tex2D(DiffuseSampler6, Input.TexCoord67.xy).rgb;
float3 texel7 = tex2D(DiffuseSampler7, Input.TexCoord67.zw).rgb;
float3 texel8 = tex2D(DiffuseSampler8, Input.TexCoord89.xy).rgb;
float3 texel9 = tex2D(DiffuseSampler9, Input.TexCoord89.zw).rgb;
float3 texelA = tex2D(DiffuseSamplerA, Input.TexCoordA).rgb;
float3 texel0 = tex2D(DiffuseSampler0, Input.TexCoord0).rgb;
float3 texel1 = tex2D(DiffuseSampler1, Input.TexCoord12.xy).rgb;
float3 texel2 = tex2D(DiffuseSampler2, Input.TexCoord12.zw).rgb;
float3 texel3 = tex2D(DiffuseSampler3, Input.TexCoord34.xy).rgb;
float3 texel4 = tex2D(DiffuseSampler4, Input.TexCoord34.zw).rgb;
float3 texel5 = tex2D(DiffuseSampler5, Input.TexCoord56.xy).rgb;
float3 texel6 = tex2D(DiffuseSampler6, Input.TexCoord56.zw).rgb;
float3 texel7 = tex2D(DiffuseSampler7, Input.TexCoord78.xy).rgb;
float3 texel8 = tex2D(DiffuseSampler8, Input.TexCoord78.zw).rgb;
float3 texel9 = tex2D(DiffuseSampler9, Input.TexCoord9A.xy).rgb;
float3 texelA = tex2D(DiffuseSamplerA, Input.TexCoord9A.zw).rgb;
float3 blend;
// addition
if (BloomBlendMode == 0)
{
texel0 *= Level0123Weight.x;
texel1 *= Level0123Weight.y;
texel2 *= Level0123Weight.z;
texel3 *= Level0123Weight.w;
texel4 *= Level4567Weight.x;
texel5 *= Level4567Weight.y;
texel6 *= Level4567Weight.z;
texel7 *= Level4567Weight.w;
texel8 *= Level89AWeight.x;
texel9 *= Level89AWeight.y;
texelA *= Level89AWeight.z;
texel0 *= Level0Weight;
texel1 *= Level12Weight.x;
texel2 *= Level12Weight.y;
texel3 *= Level34Weight.x;
texel4 *= Level34Weight.y;
texel5 *= Level56Weight.x;
texel6 *= Level56Weight.y;
texel7 *= Level78Weight.x;
texel8 *= Level78Weight.y;
texel9 *= Level9AWeight.x;
texelA *= Level9AWeight.y;
float3 bloom = float3(
texel1 +
@ -306,7 +309,7 @@ float4 ps_main(PS_INPUT Input) : COLOR
bloom.b += bloomOverdrive.r * 0.5f;
bloom.b += bloomOverdrive.g * 0.5f;
float2 NoiseCoord = Input.TexCoord01.xy;
float2 NoiseCoord = Input.TexCoord0;
float3 NoiseFactor = GetNoiseFactor(bloom, random(NoiseCoord));
blend = texel0 + bloom * NoiseFactor;
@ -326,17 +329,17 @@ float4 ps_main(PS_INPUT Input) : COLOR
texel9 = min(texel0, texel9);
texelA = min(texel0, texelA);
blend = texel0 * Level0123Weight.x;
blend = lerp(blend, texel1, Level0123Weight.y * BloomScale);
blend = lerp(blend, texel2, Level0123Weight.z * BloomScale);
blend = lerp(blend, texel3, Level0123Weight.w * BloomScale);
blend = lerp(blend, texel4, Level4567Weight.x * BloomScale);
blend = lerp(blend, texel5, Level4567Weight.y * BloomScale);
blend = lerp(blend, texel6, Level4567Weight.z * BloomScale);
blend = lerp(blend, texel7, Level4567Weight.w * BloomScale);
blend = lerp(blend, texel8, Level89AWeight.x * BloomScale);
blend = lerp(blend, texel9, Level89AWeight.y * BloomScale);
blend = lerp(blend, texelA, Level89AWeight.z * BloomScale);
blend = texel0 * Level0Weight;
blend = lerp(blend, texel1, Level12Weight.x * BloomScale);
blend = lerp(blend, texel2, Level12Weight.y * BloomScale);
blend = lerp(blend, texel3, Level34Weight.x * BloomScale);
blend = lerp(blend, texel4, Level34Weight.y * BloomScale);
blend = lerp(blend, texel5, Level56Weight.x * BloomScale);
blend = lerp(blend, texel6, Level56Weight.y * BloomScale);
blend = lerp(blend, texel7, Level78Weight.x * BloomScale);
blend = lerp(blend, texel8, Level78Weight.y * BloomScale);
blend = lerp(blend, texel9, Level9AWeight.x * BloomScale);
blend = lerp(blend, texelA, Level9AWeight.y * BloomScale);
}
return float4(blend, 1.0f);

View File

@ -35,7 +35,7 @@ struct VS_OUTPUT
struct VS_INPUT
{
float3 Position : POSITION;
float4 Position : POSITION;
float4 Color : COLOR0;
float2 TexCoord : TEXCOORD0;
};
@ -53,6 +53,7 @@ struct PS_INPUT
uniform float2 ScreenDims;
uniform float2 TargetDims;
uniform float2 SourceRect;
uniform bool PrepareVector;
@ -72,7 +73,7 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float2 TexCoord = Input.Position.xy / ScreenDims;
TexCoord += PrepareVector
? 0.5f / TargetDims // half texel offset correction (DX9)
? 0.5f / TargetDims // half texel offset correction (DX9) - only for vector grpahics
: 0.0f;
Output.TexCoord01.xy = TexCoord + float2(-0.5f, -0.5f) * TargetTexelDims;
@ -89,14 +90,14 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float4 ps_main(PS_INPUT Input) : COLOR
{
float4 texel0 = tex2D(DiffuseSampler, Input.TexCoord01.xy);
float4 texel1 = tex2D(DiffuseSampler, Input.TexCoord01.zw);
float4 texel2 = tex2D(DiffuseSampler, Input.TexCoord23.xy);
float4 texel3 = tex2D(DiffuseSampler, Input.TexCoord23.zw);
float3 texel0 = tex2D(DiffuseSampler, Input.TexCoord01.xy).rgb;
float3 texel1 = tex2D(DiffuseSampler, Input.TexCoord01.zw).rgb;
float3 texel2 = tex2D(DiffuseSampler, Input.TexCoord23.xy).rgb;
float3 texel3 = tex2D(DiffuseSampler, Input.TexCoord23.zw).rgb;
float4 outTexel = (texel0 + texel1 + texel2 + texel3) / 4.0;
float3 outTexel = (texel0 + texel1 + texel2 + texel3) / 4.0;
return float4(outTexel.rgb, 1.0f);
return float4(outTexel, 1.0f);
}
//-----------------------------------------------------------------------------

View File

@ -1515,35 +1515,43 @@ int shaders::bloom_pass(render_target *rt, int source_index, poly_info *poly, in
return next_index;
}
curr_effect = bloom_effect;
curr_effect->update_uniforms();
float weight0123[4] = {
options->bloom_level0_weight,
float weight12[2] = {
options->bloom_level1_weight,
options->bloom_level2_weight,
options->bloom_level3_weight
options->bloom_level2_weight
};
float weight4567[4] = {
options->bloom_level4_weight,
float weight34[2] = {
options->bloom_level3_weight,
options->bloom_level4_weight
};
float weight56[2] = {
options->bloom_level5_weight,
options->bloom_level6_weight,
options->bloom_level7_weight
};
float weight89A[3] = {
options->bloom_level8_weight,
float weight78[2] = {
options->bloom_level7_weight,
options->bloom_level8_weight
};
float weight9A[2] = {
options->bloom_level9_weight,
options->bloom_level10_weight
};
curr_effect->set_vector("Level0123Weight", 4, weight0123);
curr_effect->set_vector("Level4567Weight", 4, weight4567);
curr_effect->set_vector("Level89AWeight", 3, weight89A);
curr_effect->set_vector("Level01Size", 4, bloom_dims[0]);
curr_effect->set_vector("Level23Size", 4, bloom_dims[2]);
curr_effect->set_vector("Level45Size", 4, bloom_dims[4]);
curr_effect->set_vector("Level67Size", 4, bloom_dims[6]);
curr_effect->set_vector("Level89Size", 4, bloom_dims[8]);
curr_effect->set_vector("LevelASize", 2, bloom_dims[10]);
curr_effect = bloom_effect;
curr_effect->update_uniforms();
curr_effect->set_float ("Level0Weight", options->bloom_level0_weight);
curr_effect->set_vector("Level12Weight", 2, weight12);
curr_effect->set_vector("Level34Weight", 2, weight34);
curr_effect->set_vector("Level56Weight", 2, weight56);
curr_effect->set_vector("Level78Weight", 2, weight78);
curr_effect->set_vector("Level9AWeight", 2, weight9A);
curr_effect->set_vector("Level0Size", 2, bloom_dims[0]);
curr_effect->set_vector("Level12Size", 4, bloom_dims[1]);
curr_effect->set_vector("Level34Size", 4, bloom_dims[3]);
curr_effect->set_vector("Level56Size", 4, bloom_dims[5]);
curr_effect->set_vector("Level78Size", 4, bloom_dims[7]);
curr_effect->set_vector("Level9ASize", 4, bloom_dims[9]);
curr_effect->set_int("BloomBlendMode", options->bloom_blend_mode);
curr_effect->set_float("BloomScale", options->bloom_scale);
@ -3185,28 +3193,6 @@ void uniform::update()
case CU_POST_FLOOR:
m_shader->set_vector("Floor", 3, options->floor);
break;
case CU_BLOOM_RESCALE:
m_shader->set_float("BloomRescale", options->bloom_scale);
break;
case CU_BLOOM_LVL0123_WEIGHTS:
{
float weight0123[4] = { options->bloom_level0_weight, options->bloom_level1_weight, options->bloom_level2_weight, options->bloom_level3_weight };
m_shader->set_vector("Level0123Weight", 4, weight0123);
break;
}
case CU_BLOOM_LVL4567_WEIGHTS:
{
float weight4567[4] = { options->bloom_level4_weight, options->bloom_level5_weight, options->bloom_level6_weight, options->bloom_level7_weight };
m_shader->set_vector("Level4567Weight", 4, weight4567);
break;
}
case CU_BLOOM_LVL89A_WEIGHTS:
{
float weight89A[3] = { options->bloom_level8_weight, options->bloom_level9_weight, options->bloom_level10_weight };
m_shader->set_vector("Level89AWeight", 3, weight89A);
break;
}
}
}

View File

@ -102,11 +102,6 @@ public:
CU_POST_POWER,
CU_POST_FLOOR,
CU_BLOOM_RESCALE,
CU_BLOOM_LVL0123_WEIGHTS,
CU_BLOOM_LVL4567_WEIGHTS,
CU_BLOOM_LVL89A_WEIGHTS,
CU_COUNT
};