58 lines
2.3 KiB
Plaintext
58 lines
2.3 KiB
Plaintext
|
#version 450
|
||
|
|
||
|
#include "../compiled.inc"
|
||
|
|
||
|
// Include functions for gbuffer operations (packFloat2() etc.)
|
||
|
#include "../std/gbuffer.glsl"
|
||
|
|
||
|
// World-space normal from the vertex shader stage
|
||
|
in vec3 wnormal;
|
||
|
|
||
|
/*
|
||
|
The G-Buffer output. Deferred rendering uses the following render target layout:
|
||
|
|
||
|
| Index | Needs #define || R | G | B | A |
|
||
|
+===================+=================++==============+==============+=================+====================+
|
||
|
| GBUF_IDX_0 | || normal (XY) | roughness | metallic/matID |
|
||
|
+-------------------+-----------------++--------------+--------------+-----------------+--------------------+
|
||
|
| GBUF_IDX_1 | || base color (RGB) | occlusion/specular |
|
||
|
+-------------------+-----------------++--------------+--------------+-----------------+--------------------+
|
||
|
| GBUF_IDX_2 | _gbuffer2 || velocity (XY) | ignore radiance | unused |
|
||
|
+-------------------+-----------------++--------------+--------------+-----------------+--------------------+
|
||
|
| GBUF_IDX_EMISSION | _EmissionShaded || emission color (RGB) | unused |
|
||
|
+-------------------+-----------------++--------------+--------------+-----------------+--------------------+
|
||
|
|
||
|
The indices as well as the GBUF_SIZE define are defined in "compiled.inc".
|
||
|
*/
|
||
|
out vec4 fragColor[GBUF_SIZE];
|
||
|
|
||
|
void main() {
|
||
|
// Pack normals into 2 components to fit into the gbuffer
|
||
|
vec3 n = normalize(wnormal);
|
||
|
n /= (abs(n.x) + abs(n.y) + abs(n.z));
|
||
|
n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);
|
||
|
|
||
|
// Define PBR material values
|
||
|
vec3 basecol = vec3(1.0);
|
||
|
float roughness = 0.0;
|
||
|
float metallic = 0.0;
|
||
|
float occlusion = 1.0;
|
||
|
float specular = 1.0;
|
||
|
uint materialId = 0;
|
||
|
vec3 emissionCol = vec3(0.0);
|
||
|
float ior = 1.450;
|
||
|
float opacity = 1.0;
|
||
|
|
||
|
// Store in gbuffer (see layout table above)
|
||
|
fragColor[GBUF_IDX_0] = vec4(n.xy, roughness, packFloatInt16(metallic, materialId));
|
||
|
fragColor[GBUF_IDX_1] = vec4(basecol.rgb, packFloat2(occlusion, specular));
|
||
|
|
||
|
#ifdef _EmissionShaded
|
||
|
fragColor[GBUF_IDX_EMISSION] = vec4(emissionCol, 0.0);
|
||
|
#endif
|
||
|
|
||
|
#ifdef _SSRefraction
|
||
|
fragColor[GBUF_IDX_REFRACTION] = vec4(ior, opacity, 0.0, 0.0);
|
||
|
#endif
|
||
|
}
|