LightingCommon.bslinc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. Technique
  2. : base("LightingCommon") =
  3. {
  4. Language = "HLSL11";
  5. Pass =
  6. {
  7. Common =
  8. {
  9. #define PI 3.1415926
  10. #define HALF_PI 1.5707963
  11. struct LightData
  12. {
  13. float3 position;
  14. float radius;
  15. float3 direction;
  16. float intensity;
  17. float3 spotAngles;
  18. float radiusSqrdInv;
  19. float3 color;
  20. };
  21. float getSpotAttenuation(float3 worldPosToLight, float3 direction, float3 angles)
  22. {
  23. float output = saturate((dot(-worldPosToLight, direction) - angles.y) * angles.z);
  24. return output * output;
  25. }
  26. float3 getDirLightContibution(SurfaceData surfaceData, LightData lightData)
  27. {
  28. float3 N = surfaceData.worldNormal.xyz;
  29. float3 L = -lightData.direction;
  30. float NoL = saturate(dot(N, L)); // TODO - Add bias here?
  31. return lightData.color * lightData.intensity * NoL;
  32. }
  33. float3 getPointLightContribution(float3 L, float3 worldPosition, SurfaceData surfaceData, LightData lightData)
  34. {
  35. float3 N = surfaceData.worldNormal.xyz;
  36. float distanceSqrd = dot(L, L);
  37. float distanceAttenuation = 1/(distanceSqrd + 1);
  38. L = normalize(L);
  39. float NoL = saturate(dot(N, L)); // TODO - Add bias here?
  40. float radiusAttenuation = distanceSqrd * lightData.radiusSqrdInv;
  41. radiusAttenuation *= radiusAttenuation;
  42. radiusAttenuation = saturate(1.0f - radiusAttenuation);
  43. radiusAttenuation *= radiusAttenuation;
  44. float attenuation = distanceAttenuation * radiusAttenuation;
  45. return lightData.color * lightData.intensity * (NoL * attenuation);
  46. }
  47. float3 getPointLightContribution(float3 worldPosition, SurfaceData surfaceData, LightData lightData)
  48. {
  49. float3 L = lightData.position - worldPosition;
  50. return getPointLightContribution(L, worldPosition, surfaceData, lightData);
  51. }
  52. float3 getSpotLightContribution(float3 worldPosition, SurfaceData surfaceData, LightData lightData)
  53. {
  54. float3 L = lightData.position - worldPosition;
  55. float3 pointLightContribution = getPointLightContribution(L, worldPosition, surfaceData, lightData);
  56. float spotFalloff = getSpotAttenuation(L, lightData.direction, lightData.spotAngles);
  57. return pointLightContribution * spotFalloff;
  58. }
  59. };
  60. };
  61. };
  62. Technique
  63. : base("LightingCommon") =
  64. {
  65. Language = "GLSL";
  66. Pass =
  67. {
  68. Common =
  69. {
  70. #define PI 3.1415926
  71. #define HALF_PI 1.5707963
  72. struct LightData
  73. {
  74. vec3 position;
  75. float radius;
  76. vec3 direction;
  77. float intensity;
  78. vec3 spotAngles;
  79. float radiusSqrdInv;
  80. vec3 color;
  81. };
  82. float getSpotAttenuation(vec3 worldPosToLight, vec3 direction, vec3 angles)
  83. {
  84. float atten = clamp((dot(-worldPosToLight, direction) - angles.y) * angles.z, 0.0, 1.0);
  85. return atten * atten;
  86. }
  87. vec3 getDirLightContibution(SurfaceData surfaceData, LightData lightData)
  88. {
  89. vec3 N = surfaceData.worldNormal.xyz;
  90. vec3 L = -lightData.direction;
  91. float NoL = clamp(dot(N, L), 0.0, 1.0); // TODO - Add bias here?
  92. return lightData.color * lightData.intensity * NoL;
  93. }
  94. vec3 getPointLightContribution(vec3 L, vec3 worldPosition, SurfaceData surfaceData, LightData lightData)
  95. {
  96. vec3 N = surfaceData.worldNormal.xyz;
  97. float distanceSqrd = dot(L, L);
  98. float distanceAttenuation = 1/(distanceSqrd + 1);
  99. L = normalize(L);
  100. float NoL = clamp(dot(N, L), 0.0, 1.0); // TODO - Add bias here?
  101. float radiusAttenuation = distanceSqrd * lightData.radiusSqrdInv;
  102. radiusAttenuation *= radiusAttenuation;
  103. radiusAttenuation = clamp(1.0f - radiusAttenuation, 0.0, 1.0);
  104. radiusAttenuation *= radiusAttenuation;
  105. float attenuation = distanceAttenuation * radiusAttenuation;
  106. return lightData.color * lightData.intensity * ((NoL * attenuation));
  107. }
  108. vec3 getPointLightContribution(vec3 worldPosition, SurfaceData surfaceData, LightData lightData)
  109. {
  110. vec3 L = lightData.position - worldPosition;
  111. return getPointLightContribution(L, worldPosition, surfaceData, lightData);
  112. }
  113. vec3 getSpotLightContribution(vec3 worldPosition, SurfaceData surfaceData, LightData lightData)
  114. {
  115. vec3 L = lightData.position - worldPosition;
  116. vec3 pointLightContribution = getPointLightContribution(L, worldPosition, surfaceData, lightData);
  117. float spotFalloff = getSpotAttenuation(L, lightData.direction, lightData.spotAngles);
  118. return pointLightContribution * spotFalloff;
  119. }
  120. };
  121. };
  122. };