GBufferCommon.glsl 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. // Defines the interfaces for the programs that write the GBuffer
  6. #pragma once
  7. #include <AnKi/Shaders/PackFunctions.glsl>
  8. #include <AnKi/Shaders/Include/ModelTypes.h>
  9. //
  10. // Vert input
  11. //
  12. #if defined(ANKI_VERTEX_SHADER)
  13. layout(location = VERTEX_ATTRIBUTE_ID_POSITION) in Vec3 in_position;
  14. # if ANKI_PASS == PASS_GB
  15. layout(location = VERTEX_ATTRIBUTE_ID_UV0) in Vec2 in_uv;
  16. layout(location = VERTEX_ATTRIBUTE_ID_NORMAL) in Vec3 in_normal;
  17. layout(location = VERTEX_ATTRIBUTE_ID_TANGENT) in Vec4 in_tangent;
  18. # endif
  19. # if ANKI_BONES
  20. layout(location = VERTEX_ATTRIBUTE_ID_BONE_WEIGHTS) in Vec4 in_boneWeights;
  21. layout(location = VERTEX_ATTRIBUTE_ID_BONE_INDICES) in UVec4 in_boneIndices;
  22. # endif
  23. #endif
  24. //
  25. // Vert out
  26. //
  27. #if defined(ANKI_VERTEX_SHADER)
  28. out gl_PerVertex
  29. {
  30. Vec4 gl_Position;
  31. };
  32. # if ANKI_PASS == PASS_GB
  33. layout(location = 0) out Vec2 out_uv;
  34. layout(location = 1) out Vec3 out_normal;
  35. layout(location = 2) out Vec3 out_tangent;
  36. layout(location = 3) out Vec3 out_bitangent;
  37. # if REALLY_USING_PARALLAX
  38. layout(location = 4) out F32 out_distFromTheCamera;
  39. layout(location = 5) out Vec3 out_eyeTangentSpace;
  40. layout(location = 6) out Vec3 out_normalTangentSpace;
  41. # endif
  42. # if ANKI_VELOCITY || ANKI_BONES
  43. layout(location = 7) out Vec2 out_velocity;
  44. # endif
  45. # endif // ANKI_PASS == PASS_GB
  46. #endif // defined(ANKI_VERTEX_SHADER)
  47. //
  48. // Frag input
  49. //
  50. #if defined(ANKI_FRAGMENT_SHADER) && ANKI_PASS == PASS_GB
  51. layout(location = 0) in Vec2 in_uv;
  52. layout(location = 1) in Vec3 in_normal;
  53. layout(location = 2) in Vec3 in_tangent;
  54. layout(location = 3) in Vec3 in_bitangent;
  55. # if REALLY_USING_PARALLAX
  56. layout(location = 4) in F32 in_distFromTheCamera;
  57. layout(location = 5) in Vec3 in_eyeTangentSpace;
  58. layout(location = 6) in Vec3 in_normalTangentSpace;
  59. # endif
  60. # if ANKI_VELOCITY || ANKI_BONES
  61. layout(location = 7) in Vec2 in_velocity;
  62. # endif
  63. #endif
  64. //
  65. // Frag out
  66. //
  67. #if defined(ANKI_FRAGMENT_SHADER) && (ANKI_PASS == PASS_GB || ANKI_PASS == PASS_EZ)
  68. layout(location = 0) out Vec4 out_gbuffer0;
  69. layout(location = 1) out Vec4 out_gbuffer1;
  70. layout(location = 2) out Vec4 out_gbuffer2;
  71. layout(location = 3) out Vec2 out_gbuffer3;
  72. #endif
  73. //
  74. // Functions
  75. //
  76. // Write the data to RTs
  77. #if defined(ANKI_FRAGMENT_SHADER) && ANKI_PASS == PASS_GB
  78. void writeGBuffer(Vec3 diffColor, Vec3 normal, Vec3 specularColor, F32 roughness, F32 subsurface, Vec3 emission,
  79. F32 metallic, Vec2 velocity)
  80. {
  81. GbufferInfo g;
  82. g.m_diffuse = diffColor;
  83. g.m_normal = normal;
  84. g.m_specular = specularColor;
  85. g.m_roughness = roughness;
  86. g.m_subsurface = subsurface;
  87. g.m_emission = (emission.r + emission.g + emission.b) / 3.0;
  88. g.m_metallic = metallic;
  89. g.m_velocity = velocity;
  90. writeGBuffer(g, out_gbuffer0, out_gbuffer1, out_gbuffer2, out_gbuffer3);
  91. }
  92. #endif