NormalShader.fx
上传用户:henghua
上传日期:2007-11-14
资源大小:7655k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. float dsizeX,dsizeY;
  2. float4 corner00, corner10, corner01, corner11;
  3. float amplitude;
  4. struct VS_INPUT
  5. {
  6.     float3  Pos     : POSITION;
  7.     float2  tc     : TEXCOORD0;
  8. };
  9. struct VS_OUTPUT
  10. {
  11. float4  Pos : POSITION;
  12. float2 tc : TEXCOORD0;
  13. float3  tc01 : TEXCOORD1;
  14. float3  tc11 : TEXCOORD2;
  15. float3  tc00 : TEXCOORD3;
  16. float3  tc10 : TEXCOORD4;
  17. };
  18. texture heightmap;
  19. sampler hsampler = sampler_state 
  20. {
  21. texture = <heightmap>;
  22. AddressU  = WRAP;
  23. AddressV  = WRAP;
  24. MIPFILTER = NONE;
  25. MINFILTER = LINEAR;
  26. MAGFILTER = LINEAR;
  27. };
  28. VS_OUTPUT VShader(VS_INPUT i)
  29. {
  30. VS_OUTPUT o;
  31. o.Pos = float4( i.tc.x*2-1,1-i.tc.y*2, 0, 1 );
  32. float scale = 1;
  33. float2 tc = i.tc + float2(-dsizeX*scale,0);
  34. float4 meh = lerp(lerp(corner00,corner10,tc.x),lerp(corner01,corner11,tc.x),tc.y);
  35. o.tc00 = meh.xyz/meh.w;
  36. tc = i.tc + float2(dsizeX*scale,0);
  37. meh = lerp(lerp(corner00,corner10,tc.x),lerp(corner01,corner11,tc.x),tc.y);
  38. o.tc01 = meh.xyz/meh.w;
  39. tc = i.tc + float2(0,-dsizeY*scale);
  40. meh = lerp(lerp(corner00,corner10,tc.x),lerp(corner01,corner11,tc.x),tc.y);
  41. o.tc10 = meh.xyz/meh.w;
  42. tc = i.tc + float2(0,dsizeY*scale);
  43. meh = lerp(lerp(corner00,corner10,tc.x),lerp(corner01,corner11,tc.x),tc.y);
  44. o.tc11 = meh.xyz/meh.w;
  45. o.tc = i.tc;
  46. return o;
  47. }
  48. float4 PShader(VS_OUTPUT i) : COLOR
  49. {
  50. float2 dx = {dsizeX,0},
  51. dy = {0,dsizeY};
  52. i.tc01.y = amplitude*tex2D(hsampler, i.tc+dx);
  53. i.tc00.y = amplitude*tex2D(hsampler, i.tc-dx);
  54. i.tc11.y = amplitude*tex2D(hsampler, i.tc+dy);
  55. i.tc10.y = amplitude*tex2D(hsampler, i.tc-dy);
  56. float3 normal = normalize(-cross(i.tc01-i.tc00, i.tc11-i.tc10));
  57. return float4(0.5+0.5*normal,1);
  58. }
  59. technique T0
  60. {
  61. pass P0
  62. {
  63. vertexshader = compile vs_2_0 VShader();
  64. pixelshader = compile ps_2_0 PShader();  
  65. }
  66. }