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

游戏引擎

开发平台:

Visual C++

  1. void instancing_vp(uniform float3x4   worldMatrix3x4Array[80], float4 position : POSITION,
  2. float3 normal : NORMAL,
  3. float2 uv : TEXCOORD0,
  4. float index : TEXCOORD1,
  5. uniform float4x4 viewProjectionMatrix,
  6. uniform float4 lightPos,
  7. uniform float4 ambient,
  8. uniform float4 lightDiffuseColour,
  9. out float4 oPosition : POSITION,
  10. out float2 oUv : TEXCOORD0,
  11. out float4 Color : COLOR )
  12. {
  13. // transform by indexed matrix
  14. float4 transformedPos = float4(mul(worldMatrix3x4Array[index], position).xyz, 1.0);
  15. // view / projection
  16. oPosition = mul(viewProjectionMatrix, transformedPos);
  17. oUv = uv;
  18. float3 norm = mul((float3x3)worldMatrix3x4Array[index], normal);
  19. float3 lightDir =  normalize(
  20. lightPos.xyz -  (transformedPos.xyz * lightPos.w));
  21. Color = ambient + saturate(dot(lightDir, norm)) * lightDiffuseColour;
  22. }
  23. /*
  24.   Instancing shadow-caster pass
  25. */
  26. void instancingCaster_vp(
  27. float4 position : POSITION,
  28. float3 normal   : NORMAL,
  29. float index     : TEXCOORD1,
  30. out float4 oPosition : POSITION,
  31. out float4 colour    : COLOR,
  32. // Support up to 80 bones of float3x4
  33. uniform float3x4   worldMatrix3x4Array[80],
  34. uniform float4x4 viewProjectionMatrix,
  35. uniform float4   ambient)
  36. {
  37. // transform by indexed matrix
  38. float4 transformedPos = float4(mul(worldMatrix3x4Array[index], position).xyz, 1.0);
  39. // view / projection
  40. oPosition = mul(viewProjectionMatrix, transformedPos);
  41. colour = ambient;
  42. }
  43. void crowd_vp(
  44. float4 position : POSITION,
  45. float3 normal   : NORMAL,
  46. float2 uv       : TEXCOORD0,
  47. float4  blendIdx : BLENDINDICES,
  48. float4 blendWgt : BLENDWEIGHT,
  49. float   index : TEXCOORD1,
  50. out float4 oPosition : POSITION,
  51. out float2 oUv       : TEXCOORD0,
  52. out float4 colour           : COLOR,
  53. // Support up to 20 bones of float3x4
  54. // vs_2_0 only supports 256 params so more than this is not feasible
  55. uniform float4x4 viewProjectionMatrix,
  56. uniform float numBones,
  57. uniform float3x4   worldMatrix3x4Array[80],
  58. uniform float4 lightDiffuseColour,
  59. uniform float4 ambient,
  60. uniform float4 lightPos)
  61. {
  62. // transform by indexed matrix
  63. float4 blendPos = float4(0,0,0,0);
  64. int i;
  65. for (i = 0; i < 4; ++i)
  66. {
  67. blendPos += float4(mul(worldMatrix3x4Array[index*numBones+blendIdx[i]], position).xyz, 1.0) * blendWgt[i];
  68. }
  69. // view / projection
  70. oPosition = mul(viewProjectionMatrix, blendPos);
  71. oUv = uv;
  72. float3 norm = float3(0,0,0);
  73. for (i = 0; i < 4; ++i)
  74. {
  75. norm += mul((float3x3)worldMatrix3x4Array[index*numBones+blendIdx[i]], normal)* blendWgt[i];
  76. }
  77. float3 lightDir =  normalize(
  78. lightPos.xyz -  (blendPos.xyz * lightPos.w));
  79. colour = ambient + saturate(dot(lightDir, norm)) * lightDiffuseColour;
  80. }
  81. /*
  82.   Single-weight-per-vertex hardware skinning, shadow-caster pass
  83. */
  84. void crowdCaster_vp(
  85. float4 position : POSITION,
  86. float3 normal   : NORMAL,
  87. float  blendIdx : BLENDINDICES,
  88. float index     : TEXCOORD1,
  89. out float4 oPosition : POSITION,
  90. out float4 colour    : COLOR,
  91. // Support up to 24 bones of float3x4
  92. // vs_1_1 only supports 96 params so more than this is not feasible
  93. uniform float3x4   worldMatrix3x4Array[80],
  94. uniform float4x4 viewProjectionMatrix,
  95. uniform float numBones,
  96. uniform float4   ambient)
  97. {
  98. // transform by indexed matrix
  99. float4 blendPos = float4(mul(worldMatrix3x4Array[index*numBones+blendIdx], position).xyz, 1.0);
  100. // view / projection
  101. oPosition = mul(viewProjectionMatrix, blendPos);
  102. colour = ambient;
  103. }