Transparent.bsl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include "$ENGINE$\BasePass.bslinc"
  2. #include "$ENGINE$\LightingCommon.bslinc"
  3. Parameters =
  4. {
  5. Sampler2D gAlbedoSamp : alias("gAlbedoTex");
  6. Sampler2D gNormalSamp : alias("gNormalTex");
  7. Texture2D gAlbedoTex;
  8. Texture2D gNormalTex = "normal";
  9. float gOpacity = 1.0f;
  10. };
  11. Blocks =
  12. {
  13. Block MaterialParams;
  14. };
  15. Transparent = true;
  16. Technique
  17. : inherits("LightingCommon")
  18. : base("Surface") =
  19. {
  20. Language = "HLSL11";
  21. Pass =
  22. {
  23. DepthWrite = false;
  24. Target =
  25. {
  26. Blend = true;
  27. Color = { SRCA, SRCIA, ADD };
  28. };
  29. Fragment =
  30. {
  31. SamplerState gAlbedoSamp : register(s0);
  32. SamplerState gNormalSamp : register(s1);
  33. Texture2D gAlbedoTex : register(t0);
  34. Texture2D gNormalTex : register(t1);
  35. StructuredBuffer<LightData> gLights : register(t2);
  36. cbuffer LightParams : register(b4)
  37. {
  38. // Offsets at which specific light types begin in gLights buffer
  39. // Assumed directional lights start at 0
  40. // x - offset to point lights, y - offset to spot lights, z - total number of lights
  41. uint3 gLightOffsets;
  42. }
  43. cbuffer MaterialParams : register(b5)
  44. {
  45. float gOpacity;
  46. }
  47. float4 main(in VStoFS input) : SV_Target0
  48. {
  49. float3 normal = normalize(gNormalTex.Sample(gNormalSamp, input.uv0) * 2.0f - float3(1, 1, 1));
  50. float3 worldNormal = calcWorldNormal(input, normal);
  51. SurfaceData surfaceData;
  52. surfaceData.albedo = gAlbedoTex.Sample(gAlbedoSamp, input.uv0);
  53. surfaceData.worldNormal.xyz = worldNormal;
  54. float3 lightAccumulator = 0;
  55. for(uint i = 0; i < gLightOffsets[0]; ++i)
  56. lightAccumulator += getDirLightContibution(surfaceData, gLights[i]);
  57. for (uint i = gLightOffsets[0]; i < gLightOffsets[1]; ++i)
  58. lightAccumulator += getPointLightContribution(input.worldPosition, surfaceData, gLights[i]);
  59. for(uint i = gLightOffsets[1]; i < gLightOffsets[2]; ++i)
  60. lightAccumulator += getSpotLightContribution(input.worldPosition, surfaceData, gLights[i]);
  61. float3 diffuse = surfaceData.albedo.xyz / PI;
  62. return float4(diffuse * lightAccumulator, gOpacity); // TODO - Add better lighting model later
  63. }
  64. };
  65. };
  66. };
  67. Technique
  68. : inherits("LightingCommon")
  69. : base("Surface") =
  70. {
  71. Language = "GLSL";
  72. Pass =
  73. {
  74. DepthWrite = false;
  75. Target =
  76. {
  77. Blend = true;
  78. Color = { SRCA, SRCIA, ADD };
  79. };
  80. Fragment =
  81. {
  82. layout(location = 0) in vec2 uv0;
  83. layout(location = 1) in vec3 worldPosition;
  84. layout(location = 2) in vec3 tangentToWorldZ;
  85. layout(location = 3) in vec4 tangentToWorldX;
  86. layout(binding = 4) uniform sampler2D gAlbedoTex;
  87. layout(binding = 5) uniform sampler2D gNormalTex;
  88. layout(std430, binding = 6) buffer gLights
  89. {
  90. LightData[] gLightsData;
  91. };
  92. layout(binding = 7, std140) uniform LightParams
  93. {
  94. // Offsets at which specific light types begin in gLights buffer
  95. // Assumed directional lights start at 0
  96. // x - offset to point lights, y - offset to spot lights, z - total number of lights
  97. uvec3 gLightOffsets;
  98. };
  99. layout(binding = 8, std140) uniform MaterialParams
  100. {
  101. float gOpacity;
  102. };
  103. layout(location = 0) out vec4 fragColor;
  104. void main()
  105. {
  106. vec3 normal = normalize(texture(gNormalTex, uv0).xyz * 2.0f - vec3(1, 1, 1));
  107. vec3 worldNormal = calcWorldNormal(tangentToWorldZ, tangentToWorldX, normal);
  108. SurfaceData surfaceData;
  109. surfaceData.albedo = texture(gAlbedoTex, uv0);
  110. surfaceData.worldNormal.xyz = worldNormal;
  111. vec3 lightAccumulator = vec3(0, 0, 0);
  112. for(uint i = 0; i < gLightOffsets[0]; ++i)
  113. {
  114. LightData lightData = gLightsData[i];
  115. lightAccumulator += getDirLightContibution(surfaceData, lightData);
  116. }
  117. for (uint i = gLightOffsets[0]; i < gLightOffsets[1]; ++i)
  118. {
  119. LightData lightData = gLightsData[i];
  120. lightAccumulator += getPointLightContribution(worldPosition, surfaceData, lightData);
  121. }
  122. for(uint i = gLightOffsets[1]; i < gLightOffsets[2]; ++i)
  123. {
  124. LightData lightData = gLightsData[i];
  125. lightAccumulator += getSpotLightContribution(worldPosition, surfaceData, lightData);
  126. }
  127. vec3 diffuse = surfaceData.albedo.xyz / PI; // TODO - Add better lighting model later
  128. fragColor = vec4(diffuse * lightAccumulator, gOpacity);
  129. }
  130. };
  131. };
  132. };
  133. #include "$ENGINE$\Surface.bslinc"