Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "// GLSL Fragment Shader \"fsmain\"
- // Generated by XShaderCompiler
- // 20/05/2019 12:04:21
- #version 450
- layout(location = 0) in vec2 bs_TEXCOORD0;
- layout(location = 1) in vec3 bs_TEXCOORD1;
- layout(location = 2) in vec3 bs_NORMAL0;
- layout(location = 3) in vec4 bs_TANGENT0;
- layout(location = 0) out vec3 SV_Target0;
- layout(location = 1) out vec4 SV_Target1;
- layout(location = 2) out vec4 SV_Target2;
- layout(location = 3) out vec2 SV_Target3;
- layout(location = 4) out float SV_Target4;
- layout(std140, row_major, binding = 15) uniform PerObject
- {
- mat4 gMatWorld;
- mat4 gMatInvWorld;
- mat4 gMatWorldNoScale;
- mat4 gMatInvWorldNoScale;
- float gWorldDeterminantSign;
- uint gLayer;
- };
- struct VStoFS
- {
- vec4 position;
- vec2 uv0;
- vec3 worldPosition;
- vec3 tangentToWorldZ;
- vec4 tangentToWorldX;
- };
- vec3 calcWorldNormal(VStoFS xsr_input, vec3 surfaceNormal)
- {
- vec3 tangentToWorldX = xsr_input.tangentToWorldX.xyz;
- vec3 tangentToWorldZ = xsr_input.tangentToWorldZ;
- vec3 tangentToWorldY = cross(tangentToWorldZ, tangentToWorldX) * xsr_input.tangentToWorldX.w;
- mat3 tangentToWorld = mat3(tangentToWorldX, tangentToWorldY, tangentToWorldZ);
- return normalize((tangentToWorld * surfaceNormal));
- }
- struct SurfaceData
- {
- vec4 albedo;
- vec4 worldNormal;
- float depth;
- float roughness;
- float metalness;
- uint mask;
- };
- void encodeGBuffer(SurfaceData data, out vec4 GBufferAData, out vec4 GBufferBData, out vec2 GBufferCData, out float GBufferDData)
- {
- GBufferAData = data.albedo;
- GBufferBData.xyz = vec3(data.worldNormal.xyz * 0.5f + vec3(0.5f));
- GBufferBData.w = 1.0f;
- GBufferCData.x = data.roughness;
- GBufferCData.y = data.metalness;
- GBufferDData = float(data.mask) / 256.0f;
- }
- layout(binding = 22) uniform sampler2D gAlbedoTex;
- layout(binding = 23) uniform sampler2D gNormalTex;
- layout(binding = 24) uniform sampler2D gRoughnessTex;
- layout(binding = 25) uniform sampler2D gMetalnessTex;
- layout(binding = 26) uniform sampler2D gEmissiveMaskTex;
- layout(std140, binding = 27) uniform MaterialParams
- {
- vec2 gUVOffset;
- vec2 gUVTile;
- vec3 gEmissiveColor;
- };
- void main()
- {
- VStoFS xsr_input;
- xsr_input.position = gl_FragCoord;
- xsr_input.uv0 = bs_TEXCOORD0;
- xsr_input.worldPosition = bs_TEXCOORD1;
- xsr_input.tangentToWorldZ = bs_NORMAL0;
- xsr_input.tangentToWorldX = bs_TANGENT0;
- vec2 uv = xsr_input.uv0 * gUVTile + gUVOffset;
- vec3 normal = normalize(vec3(texture(gNormalTex, uv) * 2.0f) - vec3(1, 1, 1));
- vec3 worldNormal = calcWorldNormal(xsr_input, normal);
- SurfaceData surfaceData;
- surfaceData.albedo = texture(gAlbedoTex, uv);
- surfaceData.worldNormal.xyz = worldNormal;
- surfaceData.roughness = texture(gRoughnessTex, uv).x;
- surfaceData.metalness = texture(gMetalnessTex, uv).x;
- surfaceData.mask = gLayer;
- encodeGBuffer(surfaceData, SV_Target1, SV_Target2, SV_Target3, SV_Target4);
- SV_Target0 = gEmissiveColor * texture(gEmissiveMaskTex, uv).x;
- }
- "
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement