LightingCommon.bslinc 4.8 KB

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