OldMovieFP.cg
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. sampler RT : register(s0);
  2. sampler SplotchesTx : register(s1);
  3. sampler Texture2 : register(s2);
  4. sampler SepiaTx : register(s3);
  5. float2 calcSpriteAddr(float2 texCoord, float DirtFrequency, float period)
  6. {
  7.    return texCoord + tex1D(Texture2, period  * DirtFrequency);
  8. }
  9. float4 getSplotches(float2 spriteAddr)
  10. {
  11.    // get sprite address into paged texture coords space
  12.    spriteAddr = spriteAddr / 6.3f;
  13.    //spriteAddr = spriteAddr - frac(spriteAddr);
  14.    spriteAddr = spriteAddr - (spriteAddr /33.3f);
  15.    return tex2D(SplotchesTx, spriteAddr);
  16. }
  17. float4 OldMovie_ps (float2 texCoord  : TEXCOORD0,
  18. uniform float time_cycle_period,
  19. uniform float flicker,
  20. uniform float DirtFrequency,
  21. uniform float3 luminance,
  22. uniform float frameJitter,
  23. uniform float lumiShift
  24. ) : COLOR
  25. {
  26.    // get sprite address
  27.    float2 spriteAddr = calcSpriteAddr(texCoord, DirtFrequency, time_cycle_period);
  28.     // add some dark and light splotches to the film
  29.    float4 splotches = getSplotches(spriteAddr);
  30.    float4 specs = 1.0f - getSplotches(spriteAddr / 3.0f);
  31.    // convert color to base luminance
  32.    float4 base = tex2D(RT, texCoord + float2(0, spriteAddr.y * frameJitter));
  33.    float lumi = dot(base.rgb, luminance);
  34.    // randomly shift luminance
  35.    lumi -= spriteAddr.x * lumiShift;
  36.    // tone map luminance
  37.    base.rgb = tex1D(SepiaTx, lumi );
  38.    // calc flicker speed
  39.    float darken = frac(flicker * time_cycle_period);
  40.    // we want darken to cycle between 0.6 and 1.0
  41.    darken = abs(darken - 0.5f) * 0.4f + 0.6f;
  42.    // composite dirt onto film
  43.    return base * splotches * darken + specs;
  44. }