Advertisement
Guest User

Untitled

a guest
May 21st, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "// GLSL Fragment Shader \"fsmain\"
  2. // Generated by XShaderCompiler
  3. // 20/05/2019 12:04:21
  4.  
  5. #version 450
  6.  
  7. layout(location = 0) in vec2 bs_TEXCOORD0;
  8. layout(location = 1) in vec3 bs_TEXCOORD1;
  9. layout(location = 2) in vec3 bs_NORMAL0;
  10. layout(location = 3) in vec4 bs_TANGENT0;
  11.  
  12. layout(location = 0) out vec3  SV_Target0;
  13. layout(location = 1) out vec4  SV_Target1;
  14. layout(location = 2) out vec4  SV_Target2;
  15. layout(location = 3) out vec2  SV_Target3;
  16. layout(location = 4) out float SV_Target4;
  17.  
  18. layout(std140, row_major, binding = 15) uniform PerObject
  19. {
  20.    mat4  gMatWorld;
  21.    mat4  gMatInvWorld;
  22.    mat4  gMatWorldNoScale;
  23.    mat4  gMatInvWorldNoScale;
  24.    float gWorldDeterminantSign;
  25.    uint  gLayer;
  26. };
  27.  
  28. struct VStoFS
  29. {
  30.    vec4 position;
  31.    vec2 uv0;
  32.    vec3 worldPosition;
  33.    vec3 tangentToWorldZ;
  34.    vec4 tangentToWorldX;
  35. };
  36.  
  37. vec3 calcWorldNormal(VStoFS xsr_input, vec3 surfaceNormal)
  38. {
  39.    vec3 tangentToWorldX = xsr_input.tangentToWorldX.xyz;
  40.    vec3 tangentToWorldZ = xsr_input.tangentToWorldZ;
  41.    vec3 tangentToWorldY = cross(tangentToWorldZ, tangentToWorldX) * xsr_input.tangentToWorldX.w;
  42.    mat3 tangentToWorld = mat3(tangentToWorldX, tangentToWorldY, tangentToWorldZ);
  43.    return normalize((tangentToWorld * surfaceNormal));
  44. }
  45.  
  46. struct SurfaceData
  47. {
  48.    vec4  albedo;
  49.    vec4  worldNormal;
  50.    float depth;
  51.    float roughness;
  52.    float metalness;
  53.    uint  mask;
  54. };
  55.  
  56. void encodeGBuffer(SurfaceData data, out vec4 GBufferAData, out vec4 GBufferBData, out vec2 GBufferCData, out float GBufferDData)
  57. {
  58.    GBufferAData = data.albedo;
  59.    GBufferBData.xyz = vec3(data.worldNormal.xyz * 0.5f + vec3(0.5f));
  60.    GBufferBData.w = 1.0f;
  61.    GBufferCData.x = data.roughness;
  62.    GBufferCData.y = data.metalness;
  63.    GBufferDData = float(data.mask) / 256.0f;
  64. }
  65.  
  66. layout(binding = 22) uniform sampler2D gAlbedoTex;
  67.  
  68. layout(binding = 23) uniform sampler2D gNormalTex;
  69.  
  70. layout(binding = 24) uniform sampler2D gRoughnessTex;
  71.  
  72. layout(binding = 25) uniform sampler2D gMetalnessTex;
  73.  
  74. layout(binding = 26) uniform sampler2D gEmissiveMaskTex;
  75.  
  76. layout(std140, binding = 27) uniform MaterialParams
  77. {
  78.    vec2 gUVOffset;
  79.    vec2 gUVTile;
  80.    vec3 gEmissiveColor;
  81. };
  82.  
  83. void main()
  84. {
  85.    VStoFS xsr_input;
  86.    xsr_input.position        = gl_FragCoord;
  87.    xsr_input.uv0             = bs_TEXCOORD0;
  88.    xsr_input.worldPosition   = bs_TEXCOORD1;
  89.    xsr_input.tangentToWorldZ = bs_NORMAL0;
  90.    xsr_input.tangentToWorldX = bs_TANGENT0;
  91.    vec2 uv = xsr_input.uv0 * gUVTile + gUVOffset;
  92.    vec3 normal = normalize(vec3(texture(gNormalTex, uv) * 2.0f) - vec3(1, 1, 1));
  93.    vec3 worldNormal = calcWorldNormal(xsr_input, normal);
  94.    SurfaceData surfaceData;
  95.    surfaceData.albedo = texture(gAlbedoTex, uv);
  96.    surfaceData.worldNormal.xyz = worldNormal;
  97.    surfaceData.roughness = texture(gRoughnessTex, uv).x;
  98.    surfaceData.metalness = texture(gMetalnessTex, uv).x;
  99.    surfaceData.mask = gLayer;
  100.    encodeGBuffer(surfaceData, SV_Target1, SV_Target2, SV_Target3, SV_Target4);
  101.    SV_Target0 = gEmissiveColor * texture(gEmissiveMaskTex, uv).x;
  102. }
  103.  
  104. "
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement