58 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #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
 | |
| }
 |