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

游戏引擎

开发平台:

Visual C++

  1. // Vertex program for fresnel reflections / refractions
  2. void main_vp(
  3. float4 pos : POSITION,
  4. float4 normal : NORMAL,
  5. float2 tex : TEXCOORD0,
  6. out float4 oPos : POSITION,
  7. out float fresnel   : COLOR,
  8. out float3 noiseCoord : TEXCOORD0,
  9. out float4 projectionCoord : TEXCOORD1,
  10. uniform float4x4 worldViewProjMatrix,
  11. uniform float3 eyePosition, // object space
  12. uniform float fresnelBias,
  13. uniform float fresnelScale,
  14. uniform float fresnelPower,
  15. uniform float timeVal,
  16. uniform float scale,  // the amount to scale the noise texture by
  17. uniform float scroll, // the amount by which to scroll the noise
  18. uniform float noise  // the noise perturb as a factor of the  time
  19. )
  20. {
  21. oPos = mul(worldViewProjMatrix, pos);
  22. // Projective texture coordinates, adjust for mapping
  23. float4x4 scalemat = float4x4(0.5,   0,   0, 0.5, 
  24.                                0,-0.5,   0, 0.5,
  25.    0,   0, 0.5, 0.5,
  26.    0,   0,   0,   1);
  27. projectionCoord = mul(scalemat, oPos);
  28. // Noise map coords
  29. noiseCoord.xy = (tex + (timeVal * scroll)) * scale;
  30. noiseCoord.z = noise * timeVal;
  31. // calc fresnel factor (reflection coefficient)
  32. float3 eyeDir = normalize(pos.xyz - eyePosition);
  33. fresnel = fresnelBias + fresnelScale * pow(1 + dot(eyeDir, normal), fresnelPower);
  34. }
  35. // Fragment program for distorting a texture using a 3D noise texture
  36. void main_fp(
  37. float fresnel : COLOR,
  38. float3 noiseCoord : TEXCOORD0,
  39. float4 projectionCoord : TEXCOORD1,
  40. out float4 col : COLOR,
  41. uniform float distortionRange,
  42. uniform float4 tintColour,
  43. uniform sampler3D noiseMap,
  44. uniform sampler2D reflectMap,
  45. uniform sampler2D refractMap
  46. )
  47. {
  48. // Randomly chosen offset for y noise sample
  49. float3 yoffset = float3(0.31, 0.58, 0.23);
  50. float2 distort;
  51. // Sample the noise texture at 2 places
  52. distort.x = tex3D(noiseMap, noiseCoord).x;
  53. distort.y = tex3D(noiseMap, noiseCoord + yoffset).x;
  54. // Scale the distortion from [0,1] to [-range,range]
  55. distort = (distort * 2 - 1) * distortionRange;
  56. // Do the tex projection manually so we can distort _after_
  57. float2 final = projectionCoord.xy / projectionCoord.w;
  58. final += distort;
  59. float4 reflectionColour = tex2D(reflectMap, final);
  60. float4 refractionColour = tex2D(refractMap, final) + tintColour;
  61. col = lerp(refractionColour, reflectionColour, fresnel);
  62. }