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

游戏引擎

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // shadowcasterfp.cg
  4. //
  5. // Hamilton Chong
  6. // (c) 2006
  7. //
  8. // This is an example fragment shader for shadow caster objects.  
  9. //
  10. /////////////////////////////////////////////////////////////////////////////////
  11. // Define outputs from vertex shader.
  12. struct VertexOut
  13. {
  14.   float4 position   : POSITION;     // can't rely on access to this
  15.   float4 pos       : TEXCOORD0;    // position of fragment (in homogeneous coordinates)
  16.   float4 normal     : TEXCOORD1;    // un-normalized normal in object space
  17.   float4 modelPos   : TEXCOORD2;    // coordinates of model in object space at this point
  18. };
  19. struct FragmentOut
  20. {
  21.     float4 color  : COLOR0;
  22. };
  23. FragmentOut main( VertexOut        In,                     // fragment to process
  24.                   uniform float    uDepthOffset,           // offset amount (constant in eye space)
  25.                   uniform float4x4 uProjection             // projection matrix
  26.               )
  27. {
  28.     FragmentOut Out;
  29.     // compute the "normalized device coordinates" (no viewport applied yet)
  30.     float4 postproj = In.pos / In.pos.w;
  31.     // get the normalized normal of the geometry seen at this point
  32.     float4 normal = normalize(In.normal);
  33.     // -- Computing Depth Bias Quantities -----------------------------
  34.     // We now compute the change in z that would signify a push in the z direction
  35.     // by 1 unit in eye space.  Note that eye space z is related in a nonlinear way to
  36.     // screen space z, so this is not just a constant.  
  37.     // ddepth below is how much screen space z at this point would change for that push.
  38.     // NOTE: computation of ddepth likely differs from OpenGL's glPolygonOffset "unit"
  39.     //  computation, which is allowed to be vendor specific.
  40.     float4 dpwdz = mul(uProjection, float4(0.0, 0.0, 1.0, 0.0));
  41.     float4 dpdz = (dpwdz - (postproj * dpwdz.w)) / In.pos.w;
  42.     float  ddepth = abs(dpdz.z);
  43.     // -- End depth bias helper section --------------------------------   
  44.     // We now compute the depth of the fragment.  This is the actual depth value plus
  45.     // our depth bias.  The depth bias depends on how uncertain we are about the z value
  46.     // plus some constant push in the z direction.  The exact coefficients to use are
  47.     // up to you, but at least it should be somewhat intuitive now what the tradeoffs are.
  48.     float depthval = postproj.z /* + (0.5 * dzlen)*/ + (uDepthOffset * ddepth);
  49.     depthval = (0.5 * depthval) + 0.5; // put into [0,1] range instead of [-1,1] 
  50.     
  51.     Out.color = float4(depthval, depthval * depthval, depthval, 0.0);
  52.     return Out;
  53. }