помнишь, ты мне давал пример шейдера, отыскивающего в текстуре блума самую яркую точку? у меня к сожалению не осталось той переписки, потому начал сам выдумывать. Насколько помню - там принцип тот же, что и у поиска центра масс.
вот такой шейдер получился (если честно сам пока еще не закончил 2ою часть - которая с лучами а-ля god rays)
Code: Select all
float4 PS_LightSearch(VS_OUTPUT_POST IN, float2 vPos: VPOS) : COLOR
{
float2 coord = IN.txcoord0.xy;
clip (1.1 - max(vPos.x, vPos.y)); // skip anything exept (1,1)
float4 bloomweight = 0;
float4 xyweight = 0;
int steps = 16;
float4 sample = 0;
float2 tex = 0;
tex.xy += 0.5 / steps; // offset for better performance
for (int i=0; i<(steps-1); i++) // -1 так как уже сдвинули на пол "ячейки"
{
for (int j=0; j<(steps-1); j++)
{
sample = tex2D(SamplerBloom1, tex.xy);
xyweight.x += dot(sample.rgb, 0.333) * tex.x; // со вложенным циклом проблем никаких не было
bloomweight.x += dot(sample.rgb,0.333);
tex.x += 1/steps;
}
bloomweight.y = bloomweight.x; // а вот во внешнем я что-то не уверен...
xyweight.x *= 1/bloomweight.x; // highest x scource coord
xyweight.z +=xyweight.x;
xyweight.y = bloomweight.y * tex.y;
tex.y += 1/steps;
}
xyweight.y *= 1/bloomweight.y;
xyweight.x = xyweight.z / (samples - 1);
xyweight.zw = xyweight.xy;
xyweight.zw *= 1/(1+xyweight.zw);
return float4(xyweight.zw, 0, 0);
}