scene.frag 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* scene.fs -- Contains everything for custom user scene fragment shader
  2. *
  3. * Copyright (c) 2025-2026 Le Juez Victor
  4. *
  5. * This software is provided 'as-is', without any express or implied warranty.
  6. * For conditions of distribution and use, see accompanying LICENSE file.
  7. */
  8. /* === Built-In Input Variables === */
  9. vec2 TEXCOORD = vec2(0.0);
  10. vec3 TANGENT = vec3(0.0);
  11. vec3 BITANGENT = vec3(0.0);
  12. vec3 NORMAL = vec3(0.0);
  13. /* === Built-In Output Variables === */
  14. vec3 ALBEDO = vec3(0.0);
  15. float ALPHA = 0.0;
  16. vec3 EMISSION = vec3(0.0);
  17. vec3 NORMAL_MAP = vec3(0.0);
  18. float OCCLUSION = 0.0;
  19. float ROUGHNESS = 0.0;
  20. float METALNESS = 0.0;
  21. /* === User Callable === */
  22. vec4 SampleAlbedo(vec2 texCoord)
  23. {
  24. return vColor * texture(uAlbedoMap, texCoord);
  25. }
  26. vec3 SampleEmission(vec2 texCoord)
  27. {
  28. vec3 emission = vec3(0.0);
  29. #if !defined(UNLIT) && !defined(DEPTH) && !defined(DEPTH_CUBE)
  30. emission = vEmission * texture(uEmissionMap, texCoord).rgb;
  31. #endif
  32. return emission;
  33. }
  34. vec3 SampleNormal(vec2 texCoord)
  35. {
  36. vec3 normal = vec3(0.0);
  37. #if !defined(UNLIT) && !defined(DEPTH) && !defined(DEPTH_CUBE)
  38. normal = texture(uNormalMap, texCoord).rgb;
  39. #endif
  40. return normal;
  41. }
  42. vec3 SampleOrm(vec2 texCoord)
  43. {
  44. vec3 ORM = vec3(0.0);
  45. #if !defined(UNLIT) && !defined(DEPTH) && !defined(DEPTH_CUBE)
  46. ORM = texture(uOrmMap, texCoord).rgb;
  47. ORM.x *= uOcclusion;
  48. ORM.y *= uRoughness;
  49. ORM.z *= uMetalness;
  50. #endif
  51. return ORM;
  52. }
  53. void FetchMaterial(vec2 texCoord)
  54. {
  55. vec4 color = vColor * texture(uAlbedoMap, texCoord);
  56. ALBEDO = color.rgb;
  57. ALPHA = color.a;
  58. #if !defined(UNLIT) && !defined(DEPTH) && !defined(DEPTH_CUBE)
  59. EMISSION = vEmission * texture(uEmissionMap, texCoord).rgb;
  60. NORMAL_MAP = texture(uNormalMap, texCoord).rgb;
  61. vec3 ORM = texture(uOrmMap, texCoord).rgb;
  62. OCCLUSION = uOcclusion * ORM.x;
  63. ROUGHNESS = uRoughness * ORM.y;
  64. METALNESS = uMetalness * ORM.z;
  65. #endif // !DEPTH && !DEPTH_CUBE
  66. }
  67. /* === Internal Fragment Stage === */
  68. #define fragment()
  69. void SceneFragment(vec2 texCoord, mat3 tbn, float alphaCutoff)
  70. {
  71. /* --- Fill input variables --- */
  72. TEXCOORD = texCoord;
  73. TANGENT = tbn[0];
  74. BITANGENT = tbn[1];
  75. NORMAL = tbn[2];
  76. /* --- Fetch output variables --- */
  77. #if !defined(R3D_NO_AUTO_FETCH)
  78. vec4 color = vColor * texture(uAlbedoMap, texCoord);
  79. if (color.a < alphaCutoff) discard;
  80. ALBEDO = color.rgb;
  81. ALPHA = color.a;
  82. #if !defined(UNLIT) && !defined(DEPTH) && !defined(DEPTH_CUBE)
  83. EMISSION = vEmission * texture(uEmissionMap, texCoord).rgb;
  84. NORMAL_MAP = texture(uNormalMap, texCoord).rgb;
  85. vec3 ORM = texture(uOrmMap, texCoord).rgb;
  86. OCCLUSION = uOcclusion * ORM.x;
  87. ROUGHNESS = uRoughness * ORM.y;
  88. METALNESS = uMetalness * ORM.z;
  89. #endif // !R3D_NO_AUTO_FETCH && !UNLIT && !DEPTH && !DEPTH_CUBE
  90. #endif // !R3D_NO_AUTO_FETCH
  91. /* --- Execute user code --- */
  92. fragment();
  93. // Alpha cutoff again after user code
  94. if (ALPHA < alphaCutoff) discard;
  95. }