nothing'i ben yazdığıma göre sanırım bu görev bana düşüyor
glow işlemi için en başta usage'i render target olan 256x256 surface yaratman gerekiyor. bunlar smooth yaparken swap edilecek geçici yüzeyler.
kullanacağın shader versiyonuna göre değişmekle beraber (ben 1.1 versiyon kullanmak istediğimden 5 adımda yaptım ama yeni kartlarda daha az adımda yapabilirsin) shader içerisinde bunları smooth edecek stage'leri yazman gerekli.
stage'lere örnek olması için
struct GLOW_INPUT
{
float4 pos : POSITION;
float2 texCoord : TEXCOORD;
};
struct GLOW_OUTPUT
{
float4 pos : POSITION;
float2 texCoord0 : TEXCOORD0;
float2 texCoord1 : TEXCOORD1;
float2 texCoord2 : TEXCOORD2;
float2 texCoord3 : TEXCOORD3;
};
GLOW_OUTPUT glowVSHorizontal1(GLOW_INPUT IN)
{
GLOW_OUTPUT OUT;
OUT.pos = mul( IN.pos, texTrans );
OUT.texCoord0 = IN.texCoord + float2(-pSize*3, 0);
OUT.texCoord1 = IN.texCoord + float2(-pSize*2, 0);
OUT.texCoord2 = IN.texCoord + float2(-pSize*1, 0);
OUT.texCoord3 = IN.texCoord + float2(0, 0 );
return OUT;
}
pixel glowPS(GLOW_OUTPUT IN)
{
pixel OUT;
float4 color = tex2D( GlowSampler, IN.texCoord0 ) * 0.1;
color += tex2D( GlowSampler, IN.texCoord1 ) * 0.3;
color += tex2D( GlowSampler, IN.texCoord2 ) * 0.4;
color += tex2D( GlowSampler, IN.texCoord3 ) * 0.25;
OUT.color = color;
OUT.color.a = 1.0f;
return OUT;
}
şeklinde shader limitleri yüzünden vertex shader'da hangi pixellerin ortalaması alınacağını hesaplaman gerekli. pixel shader'da bu pixellerin ortalamasını alıyorsun.
glowVSHorizontal1 benzeri aynı pixel shader'ı kullanan 3 stage daha yazman gerekli, bunlar float2(-pSize*3, 0) formülünü +x,-x,+y,-y şeklinde değiştirerek 4 yönde ortalamalar alacak.
Her stage geçisinde render target'i diğeri ile değiştirip öncekini texture olarak kullanman gerekli. 4 stage'de geçtiğinde elinde ekrana çizilecek şeyin baya bir smooth edilmiş hali olacak. bu arada pSize denilen şey 0 ile 1 arasında bir rakam ki smooth oranını belirliyor. GlowSampler shader'a geçtiğin texture.
bu smooth edilmiş halini en son 5. stage'de alpha blend ile scene'in üzerine çiziyorsun. böylece objenin etrafında hafif bir glow gözüküyor.
glow için önce glow olmasını istediğin objeyi render target'lerden ilkine çiz. daha sonra 4 stage'i işletip smooth halini elde et. daha sonra render target'i framebuffer'a alıp orjinal çizimi yap ve üstüne 5. stage'de smooth edilmiş görüntüyü üzerine bindir.
(14 saattir program yazıyorum, biraz anlatamamış olabilirim, işin içinden çıkamazsan kodları gönderirim ordan bakabilirsin)