//---------------------------------------------------------------------- //This is the type definition file for Rosetta Material pipeline types // //Author - Michal Valient //Copyright (C) 2005 Caligari corporation // //---------------------------------------------------------------------- texture2D tSourceTex; ///Source texture float2 fPixelSize; ///Size of one pixel float fHighlightThreshold = 0.5f; ///The threshold of the highlight float fBloomFilterWide = 1.0f; ///How to widen the filter kernel in passes texture2D tBloomTex; ///Bloom texture for final effect float fOriginalIntensity = 0.7f; float fBloomIntensity = 0.3f; float fHighlightIntensity = 1.5f; sampler2D smplSrcTex = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; sampler2D smplSceneTex = sampler_state { Texture = ; MinFilter = POINT; MagFilter = POINT; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; sampler2D smplBloomTex = sampler_state { Texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; AddressU = CLAMP; AddressV = CLAMP; }; float luminance(float3 color) { return dot(color, float3(0.3, 0.59, 0.11)); } // https://www.gamedev.net/forums/topic/531026-hlsl---float-to-float4-output-colour/ //change all 256 to 255 float3 float_to_color(float f) { float3 color; //f *= 256.0; f *= 255.0; color.x = floor(f); //f = (f-color.x)*256.0; f = (f-color.x)*255.0; color.y = floor(f); color.z = f-color.y; //color.xy *= 0.00390625; // *= 1.0/256 color.xy *= 0.003921568627451; // *= 1.0/255 return color; } float4 FindLuminance(float2 Tex : TEXCOORD0) : COLOR0 { float4 vRetVal = tex2D(smplSrcTex, Tex); vRetVal.a = smoothstep(fHighlightThreshold, 1.0f, luminance(vRetVal.rgb)); //vRetVal.rgb = vRetVal.rgb * vRetVal.a; if (fOriginalIntensity >= 300.0f) { //use fHighlightThreshold to get key color float3 colorfromfloat = float_to_color(fHighlightThreshold); //vRetVal.a = step(0.9, 1.0 - sqrt(vRetVal.r*vRetVal.r + (vRetVal.g-0.69412)*(vRetVal.g-0.69412) + (vRetVal.b-0.25098)*(vRetVal.b-0.25098))); // vRetVal.a = step(0.9, 1.0 - sqrt((vRetVal.r-colorfromfloat.r)*(vRetVal.r-colorfromfloat.r) + (vRetVal.g-colorfromfloat.g)*(vRetVal.g-colorfromfloat.g) + (vRetVal.b-colorfromfloat.b)*(vRetVal.b-colorfromfloat.b))); // vRetVal.a = step(0.8, 1.0 - sqrt((vRetVal.r-colorfromfloat.r)*(vRetVal.r-colorfromfloat.r) + (vRetVal.g-colorfromfloat.g)*(vRetVal.g-colorfromfloat.g) + (vRetVal.b-colorfromfloat.b)*(vRetVal.b-colorfromfloat.b))); vRetVal.a = step(0.7, 1.0 - sqrt((vRetVal.r-colorfromfloat.r)*(vRetVal.r-colorfromfloat.r) + (vRetVal.g-colorfromfloat.g)*(vRetVal.g-colorfromfloat.g) + (vRetVal.b-colorfromfloat.b)*(vRetVal.b-colorfromfloat.b))); vRetVal.rgb = vRetVal.rgb * vRetVal.a; } return vRetVal; } const float blurWeight[7] = { 0.251589 / 2.0f, 0.212965 / 2.0f, 0.161314 / 2.0f, 0.109340 / 2.0f, 0.066318 / 2.0f, 0.035994 / 2.0f, 0.017481 / 2.0f }; float4 BlurH(float2 Tex : TEXCOORD0) : COLOR0 { float4 vRetVal = tex2D(smplSrcTex, Tex) * (0.265961 / 2.0f); for (int i=0; i<7; i++) { float2 vTexH = float2(Tex.x - (float(i*2)*fPixelSize.x*fBloomFilterWide) + (fPixelSize.x*0.5f), Tex.y); vRetVal += tex2D(smplSrcTex, vTexH) * blurWeight[i]; } for (int i=0; i<7; i++) { float2 vTexH2 = float2(Tex.x + (float(i*2)*fPixelSize.x*fBloomFilterWide) - (fPixelSize.x*0.5f), Tex.y); vRetVal += tex2D(smplSrcTex, vTexH2) * blurWeight[i]; } return vRetVal; } float4 BlurV(float2 Tex : TEXCOORD0) : COLOR0 { float4 vRetVal = tex2D(smplSrcTex, Tex) * (0.265961 / 2.0f); for (int i=0; i<7; i++) { float2 vTexH = float2(Tex.x, Tex.y - (float(i*2)*fPixelSize.y*fBloomFilterWide) + (fPixelSize.y*0.5f)); vRetVal += tex2D(smplSrcTex, vTexH) * blurWeight[i]; } for (int i=0; i<7; i++) { float2 vTexH2 = float2(Tex.x, Tex.y + (float(i*2)*fPixelSize.y*fBloomFilterWide) - (fPixelSize.y*0.5f)); vRetVal += tex2D(smplSrcTex, vTexH2) * blurWeight[i]; } return vRetVal; } float4 ApplyBloom(float2 Tex : TEXCOORD0) : COLOR0 { float4 Original = tex2D(smplSceneTex, Tex); float4 Bloom = tex2D(smplBloomTex, Tex); // return Bloom;//result is just blurred image // return Original + Bloom.a * fHighlightIntensity; // return Original + Bloom.a * fHighlightIntensity; //return Original * fOriginalIntensity + Bloom * fBloomIntensity + Bloom.a * fHighlightIntensity; //February 2020 - Clinton Reese //scene intensity less than 100 normal //scene intensity between 100 and 200 only bloom(blur) //scene intensity between 200 and 300 alpha color //scene intensity 300 or more glow with color key if (fOriginalIntensity < 100.0f) Original = Original * fOriginalIntensity + Bloom * fBloomIntensity + Bloom.a * fHighlightIntensity; if (fOriginalIntensity >= 100.0f && fOriginalIntensity < 200.0f) Original = Bloom * fBloomIntensity; if (fOriginalIntensity >= 200.0f && fOriginalIntensity < 300.0f) Original = Original.a; if (fOriginalIntensity >= 300.0f) Original = Original * (fOriginalIntensity - 300.0f) + Bloom * fBloomIntensity + Bloom.a * fHighlightIntensity; return Original; } technique PostProcess { pass p0 { VertexShader = NULL; PixelShader = compile ps_2_0 FindLuminance(); ZEnable = false; StencilEnable = false; AlphaBlendEnable = false; Cullmode = NONE; } pass p1 { VertexShader = NULL; PixelShader = compile ps_2_0 BlurH(); } pass p2 { VertexShader = NULL; PixelShader = compile ps_2_0 BlurV(); } } technique FinishEffect { pass p0 { VertexShader = NULL; PixelShader = compile ps_2_0 ApplyBloom(); ZEnable = false; StencilEnable = false; AlphaBlendEnable = false; Cullmode = NONE; } }