Advertisement
Guest User

Untitled

a guest
May 21st, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.44 KB | None | 0 0
  1. "\x12\x04\x96\x19#pragma clang diagnostic ignored \"-Wmissing-prototypes\"
  2.  
  3. #include <metal_stdlib>
  4. #include <simd/simd.h>
  5.  
  6. using namespace metal;
  7.  
  8. struct VStoFS
  9. {
  10.    float4 position;
  11.    float2 uv0;
  12.    float3 worldPosition;
  13.    float3 tangentToWorldZ;
  14.    float4 tangentToWorldX;
  15. };
  16.  
  17. struct SurfaceData
  18. {
  19.    float4 albedo;
  20.    float4 worldNormal;
  21.    float depth;
  22.    float roughness;
  23.    float metalness;
  24.    uint mask;
  25. };
  26.  
  27. struct MaterialParams
  28. {
  29.    float2 gUVOffset;
  30.    float2 gUVTile;
  31.    float3 gEmissiveColor;
  32. };
  33.  
  34. struct PerObject
  35. {
  36.    float4x4 gMatWorld;
  37.    float4x4 gMatInvWorld;
  38.    float4x4 gMatWorldNoScale;
  39.    float4x4 gMatInvWorldNoScale;
  40.    float gWorldDeterminantSign;
  41.    uint gLayer;
  42. };
  43.  
  44. struct spvDescriptorSetBuffer0
  45. {
  46.    constant PerObject* m_191 [[id(15)]];
  47.    texture2d<float> gAlbedoTex [[id(22)]];
  48.    texture2d<float> gNormalTex [[id(23)]];
  49.    sampler gAlbedoTexSmplr [[id(23)]];
  50.    texture2d<float> gRoughnessTex [[id(24)]];
  51.    sampler gNormalTexSmplr [[id(24)]];
  52.    texture2d<float> gMetalnessTex [[id(25)]];
  53.    sampler gRoughnessTexSmplr [[id(25)]];
  54.    texture2d<float> gEmissiveMaskTex [[id(26)]];
  55.    sampler gMetalnessTexSmplr [[id(26)]];
  56.    constant MaterialParams* m_135 [[id(27)]];
  57.    sampler gEmissiveMaskTexSmplr [[id(27)]];
  58. };
  59.  
  60. struct main0_out
  61. {
  62.    float3 SV_Target0 [[color(0)]];
  63.    float4 SV_Target1 [[color(1)]];
  64.    float4 SV_Target2 [[color(2)]];
  65.    float2 SV_Target3 [[color(3)]];
  66.    float SV_Target4 [[color(4)]];
  67. };
  68.  
  69. struct main0_in
  70. {
  71.    float2 bs_TEXCOORD0 [[user(locn0)]];
  72.    float3 bs_TEXCOORD1 [[user(locn1)]];
  73.    float3 bs_NORMAL0 [[user(locn2)]];
  74.    float4 bs_TANGENT0 [[user(locn3)]];
  75. };
  76.  
  77. float3 calcWorldNormal(thread const VStoFS& xsr_input, thread const float3& surfaceNormal)
  78. {
  79.    float3 tangentToWorldX = xsr_input.tangentToWorldX.xyz;
  80.    float3 tangentToWorldZ = xsr_input.tangentToWorldZ;
  81.    float3 tangentToWorldY = cross(tangentToWorldZ, tangentToWorldX) * xsr_input.tangentToWorldX.w;
  82.    float3x3 tangentToWorld = float3x3(float3(tangentToWorldX), float3(tangentToWorldY), float3(tangentToWorldZ));
  83.    return normalize(tangentToWorld * surfaceNormal);
  84. }
  85.  
  86. void encodeGBuffer(thread const SurfaceData& data, thread float4& GBufferAData, thread float4& GBufferBData, thread float2& GBufferCData, thread float& GBufferDData)
  87. {
  88.    GBufferAData = data.albedo;
  89.    float3 _91 = float3((data.worldNormal.xyz * 0.5) + float3(0.5));
  90.    GBufferBData = float4(_91.x, _91.y, _91.z, GBufferBData.w);
  91.    GBufferBData.w = 1.0;
  92.    GBufferCData.x = data.roughness;
  93.    GBufferCData.y = data.metalness;
  94.    GBufferDData = float(data.mask) / 256.0;
  95. }
  96.  
  97. fragment main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]], float4 gl_FragCoord [[position]])
  98. {
  99.    main0_out out = {};
  100.    VStoFS xsr_input;
  101.    xsr_input.position = gl_FragCoord;
  102.    xsr_input.uv0 = in.bs_TEXCOORD0;
  103.    xsr_input.worldPosition = in.bs_TEXCOORD1;
  104.    xsr_input.tangentToWorldZ = in.bs_NORMAL0;
  105.    xsr_input.tangentToWorldX = in.bs_TANGENT0;
  106.    float2 uv = (xsr_input.uv0 * (*spvDescriptorSet0.m_135).gUVTile) + (*spvDescriptorSet0.m_135).gUVOffset;
  107.    float3 normal = normalize(float3((spvDescriptorSet0.gNormalTex.sample(spvDescriptorSet0.gNormalTexSmplr, uv) * 2.0).xyz) - float3(1.0));
  108.    VStoFS param = xsr_input;
  109.    float3 param_1 = normal;
  110.    float3 worldNormal = calcWorldNormal(param, param_1);
  111.    SurfaceData surfaceData;
  112.    surfaceData.albedo = spvDescriptorSet0.gAlbedoTex.sample(spvDescriptorSet0.gAlbedoTexSmplr, uv);
  113.    surfaceData.worldNormal = float4(worldNormal.x, worldNormal.y, worldNormal.z, surfaceData.worldNormal.w);
  114.    surfaceData.roughness = spvDescriptorSet0.gRoughnessTex.sample(spvDescriptorSet0.gRoughnessTexSmplr, uv).x;
  115.    surfaceData.metalness = spvDescriptorSet0.gMetalnessTex.sample(spvDescriptorSet0.gMetalnessTexSmplr, uv).x;
  116.    surfaceData.mask = (*spvDescriptorSet0.m_191).gLayer;
  117.    SurfaceData param_2 = surfaceData;
  118.    float4 param_3;
  119.    float4 param_4;
  120.    float2 param_5;
  121.    float param_6;
  122.    encodeGBuffer(param_2, param_3, param_4, param_5, param_6);
  123.    out.SV_Target1 = param_3;
  124.    out.SV_Target2 = param_4;
  125.    out.SV_Target3 = param_5;
  126.    out.SV_Target4 = param_6;
  127.    out.SV_Target0 = (*spvDescriptorSet0.m_135).gEmissiveColor * spvDescriptorSet0.gEmissiveMaskTex.sample(spvDescriptorSet0.gEmissiveMaskTexSmplr, uv).x;
  128.    return out;
  129. }
  130.  
  131. "
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement