i understand that for a bloom effect
your shader program takes evry pixel and combine it with it's next one in each direction then calculate the avrage , this is just like the most blur program that i have seen in the net.
i need to run an initial shader that will get the bright areas and make the rest black, make that into a texture to send to my post process shader. How do i do that?
i have done it but with CG for OpenGl but the idea is the same for Dx , the simple way to make the bright areas look like more brighter without effect the darker areas is that
mutiply each pixel with it self then add the reslut to the a blur effect of the pixel , that is all.
here is my CG program so you easlly could convert it to HLSL
Code: Select all
TCGShader* cgProg = new TCGShader;
cgProg->AddToVertexProgram("void main( float4 position : POSITION, ");
cgProg->AddToVertexProgram(" float4 color : COLOR, ");
cgProg->AddToVertexProgram(" float2 texCoord : TEXCOORD, ");
cgProg->AddToVertexProgram(" out float4 oPosition : POSITION, ");
cgProg->AddToVertexProgram(" out float4 oColor : COLOR, ");
cgProg->AddToVertexProgram(" out float2 oTexCoord0 : TEXCOORD0, ");
cgProg->AddToVertexProgram(" out float2 oTexCoord1 : TEXCOORD1, ");
cgProg->AddToVertexProgram(" out float2 oTexCoord2 : TEXCOORD2, ");
cgProg->AddToVertexProgram(" out float2 oTexCoord3 : TEXCOORD3, ");
cgProg->AddToVertexProgram(" out float2 oTexCoord4 : TEXCOORD4, ");
cgProg->AddToVertexProgram(" uniform float XOffset, ");
cgProg->AddToVertexProgram(" uniform float YOffset, ");
cgProg->AddToVertexProgram(" uniform float4x4 ModelViewProj) ");
cgProg->AddToVertexProgram("{ ");
cgProg->AddToVertexProgram(" oPosition = mul(ModelViewProj,position); ");
cgProg->AddToVertexProgram(" oColor = color; ");
cgProg->AddToVertexProgram(" oTexCoord0 = texCoord + float2(XOffset,YOffset); ");
cgProg->AddToVertexProgram(" oTexCoord1 = texCoord + float2(XOffset*2,YOffset*2); ");
cgProg->AddToVertexProgram(" oTexCoord2 = texCoord - float2(XOffset,YOffset); ");
cgProg->AddToVertexProgram(" oTexCoord3 = texCoord - float2(XOffset*2,YOffset*2); ");
cgProg->AddToVertexProgram(" oTexCoord4 = texCoord; ");
cgProg->AddToVertexProgram("} ");
cgProg->setVertexProfile(CG_PROFILE_ARBVP1);
cgProg->CompileVertexProgram("main");
printf("%s \n", cgProg->GetCompiledVertexProgram());
cgProg->AddToPixelProgram("void main( float2 TexCoord0 : TEXCOORD0, ");
cgProg->AddToPixelProgram(" float2 TexCoord1 : TEXCOORD1, ");
cgProg->AddToPixelProgram(" float2 TexCoord2 : TEXCOORD2, ");
cgProg->AddToPixelProgram(" float2 TexCoord3 : TEXCOORD3, ");
cgProg->AddToPixelProgram(" float2 TexCoord4 : TEXCOORD4, ");
cgProg->AddToPixelProgram(" out float4 color : COLOR, ");
cgProg->AddToPixelProgram(" uniform sampler2D txtr0 : texunit0, ");
cgProg->AddToPixelProgram(" uniform sampler2D txtr1 : texunit1) ");
cgProg->AddToPixelProgram("{ ");
cgProg->AddToPixelProgram(" float4 col1 = tex2D(txtr0, TexCoord0) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 col2 = tex2D(txtr0, TexCoord1) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 col3 = tex2D(txtr0, TexCoord2) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 col4 = tex2D(txtr0, TexCoord3) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 avg1 = (col1 + col2) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 avg2 = (col3 + col4) / 2.0f; ");
cgProg->AddToPixelProgram(" float4 blur = avg1 + avg2; ");
cgProg->AddToPixelProgram(" float4 newCol = tex2D(txtr0, TexCoord4); ");
cgProg->AddToPixelProgram(" float4 dark = newCol * newCol ; ");
cgProg->AddToPixelProgram(" color = dark+blur; ");
cgProg->AddToPixelProgram("} ");
cgProg->setPixelProfile(CG_PROFILE_ARBFP1);
cgProg->CompilePixelProgram("main");
printf("%s \n", cgProg->GetCompiledPixelProgram());
BTW this effect called GLOW effect