glsl boom

时间:2023-03-09 18:33:40
glsl   boom

原理:

1.渲染场景到fbo

2.对fbo进行高斯横向,纵向模糊,到新的fbo

3.对两张图进行叠加

模糊后的

glsl   boom

glsl   boom

效果就这样

glsl   boom

给数据加大

glsl   boom

<-vertex->

  #version 

  varying vec2 uv;

  void main(void)
{ uv = gl_MultiTexCoord0.st;
gl_Position = ftransform();
} <-fragment-> #version uniform sampler2D RTBlur;
uniform float rt_w;
uniform float rt_h;
uniform int blurType; varying vec2 uv; const int g_iFilterTime = ; // 过滤次数
const float g_fGene = (1.0/(1.0 + 2.0*(0.93 + 0.8 + 0.7 + 0.6 + 0.5 + 0.4 + 0.3 + 0.2 + 0.1))); // 衰减因子 void main(void)
{ float aryAttenuation[g_iFilterTime];
aryAttenuation[] = 0.93;
aryAttenuation[] = 0.8;
aryAttenuation[] = 0.7;
aryAttenuation[] = 0.6;
aryAttenuation[] = 0.5;
aryAttenuation[] = 0.4;
aryAttenuation[] = 0.3;
aryAttenuation[] = 0.2;
aryAttenuation[] = 0.1; vec4 sum = texture2D(RTBlur, uv)*g_fGene;
float blurStep =0.01; if( == blurType)
{
// blur in y (vertical) blurStep = 1.0 / rt_h;
vec2 vec2Step =vec2(,blurStep);
for(int i = ; i < g_iFilterTime; ++i)
{
sum += texture2D(RTBlur, uv + vec2Step)*aryAttenuation[i]*g_fGene;
sum += texture2D(RTBlur, uv - vec2Step)*aryAttenuation[i]*g_fGene;
vec2Step += vec2(,blurStep);
} }
else
{
// blur in y (vertical) blurStep = 1.0 / rt_w; vec2 vec2Step =vec2(blurStep,);
for(int i = ; i < g_iFilterTime; ++i)
{
sum += texture2D(RTBlur, uv + vec2Step)*aryAttenuation[i]*g_fGene;
sum += texture2D(RTBlur, uv - vec2Step)*aryAttenuation[i]*g_fGene;
vec2Step += vec2(blurStep,);
} } gl_FragColor = sum;
}

应该把需要发光的物体绘制boom,然后融合,这样才行,框架又得改。。。