LightingCommon.bslinc 4.6 KB

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