UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Landscape Tool
Using Editor Tools for Specific Tasks
FAQ
Programming
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes

UUSL GBuffer Structure

G-buffer is a series of textures where all the visible information is written: albedo color, normals, lightmap, etc. G-buffer is used for deferred rending pipeline.

UUSL has a handy GBuffer structure to fill it in the shader's code.

Notice
Since main workflow in UNIGINE is metalness, it has different structure of G-buffer than specular workflow has.

GBuffer Textures#

GBuffer has the following set of textures:

Texture name Type Description
Albedo RGBA8 RGB - albedo value.
A - occlusion value.
Shading RGBA8 R - metalness value.
G - F0 (specular) value.
B - translucent value.
A - microfiber value.
Normal RGBA8 RGB - normal value.
A - roughness value.
Velocity RG16F RG - pixel displacement value (XY coordinates).
Material Mask R32U R - material mask value.
Lightmap RG11B10F RGB - lightmap value.
Features RGBA8 R - bevel value.

Channels of these textures fill corresponding fields of the GBuffer structure.

UUSL
struct GBuffer {
	float3	albedo;
	float	transparent;
	
	float	metalness;
	float	roughness;
	float	f0;
	float	microfiber;
	
	float3	normal;
	float	translucent;
	
	float2	velocity;
	
	float3	lightmap;
	float	occlusion;
	
	float	bevel;
	
	int		material_mask;
};

Specular G-buffer struct has different fields:

UUSL
struct GBufferSpecular {
	float3	diffuse;
	float	transparent;
		
	float3	specular;
	float	gloss;
	float	microfiber;
		
	float3	normal;
	float	translucent;
		
	float2	velocity;
		
	float3	lightmap;
	float	occlusion;
		
	float	bevel;
		
	int		material_mask;
};

To convert Specular G-buffer to Metalness G-buffer, use specularToMetalness() function.

GBuffer Functions#

GBuffer GBufferDefault( )

Default constructor for GBuffer structure for metalness workflow. It creates an instance with default (not null) values.

Return value

GBuffer structure with default (not null) values.

GBufferSpecular GBufferSpecularDefault( )

Constructor for GBuffferSpecular structure for specular workflow. It creates an instance with default (not null) values.

Return value

GBufferSpecular structure with default (not null) values.

void shadingGBuffer( inout GBuffer gbuffer, float3 view )

Adds a view-dependent shading to the gbuffer.

Arguments

  • inout GBuffer gbuffer - GBuffer instance.
  • float3 view - View vector.

void shadingGBuffer( inout GBuffer gbuffer )

Adds a shading which is dependent on material parameters.

Arguments

  • inout GBuffer gbuffer - GBuffer instance.

GBuffer specularToMetalness( GBufferSpecular gbuffer )

Converts given specular GBufferSpecular to metalness Gbuffer.

Arguments

  • GBufferSpecular gbuffer - Specular GBufferSpecular instance to be converted.

Return value

Metalness Gbuffer instance.

void setGBuffer( GBuffer gbuffer )

Sets GBuffer values by using corresponding values of given GBuffer instance.

Arguments

  • GBuffer gbuffer - GBuffer instance with necessary values to be set.

void setGBuffer( GBufferSpecular gbuffer )

Sets GBuffer values by using corresponding values of given GBufferSpecular instance.
Inside this method specularToMetalness() is called.

Arguments

  • GBufferSpecular gbuffer - GBufferSpecular instance with necessary values to be set.

void loadGBufferAlbedo( inout GBuffer gbuffer, TEXTURE_IN TEX_ALBEDO, float2 uv )

Loads albedo texture values (albedo color and occlusion) to GBuffer.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN TEX_ALBEDO - Albedo texture.
  • float2 uv - UV coordinates.

void loadGBufferShading( inout GBuffer gbuffer, TEXTURE_IN TEX_SHADING, float2 uv )

Loads shading texture values (metalness, f0, translucence, microfiber) to GBuffer.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN TEX_SHADING - Shading texture.
  • float2 uv - UV coordinates.

void loadGBufferNormal( inout GBuffer gbuffer, TEXTURE_IN TEX_NORMAL, float2 uv )

Loads normal texture values (normal and roughness) to GBuffer.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN TEX_NORMAL - Normal texture.
  • float2 uv - UV coordinates.

void loadGBufferLightMap( inout GBuffer gbuffer, TEXTURE_IN TEX_LIGHTMAP, float2 uv )

Loads lightmap texture values to passed GBuffer instance.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN TEX_LIGHTMAP - Lightmap texture.
  • float2 uv - UV coordinates.

void loadGBufferVelocity( inout GBuffer gbuffer, TEXTURE_IN TEX_VELOCITY, float2 uv )

Loads velocity texture values to passed GBuffer instance.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN TEX_VELOCITY - Velocity texture.
  • float2 uv - UV coordinates.

void loadGBufferMaterialMask( inout GBuffer gbuffer, TEXTURE_IN_UINT TEX_MATERIAL_MASK, float2 uv )

Loads material mask texture values to passed GBuffer instance.

Arguments

  • inout GBuffer gbuffer - Gbuffer structure. Values will be written in it.
  • TEXTURE_IN_UINT TEX_MATERIAL_MASK - Material mask texture.
  • float2 uv - UV coordinates.

Usage Example#

Defining the GBuffer Structure#

To use GBuffer structure in your shader's code, you should define and initialize the GBuffer structure by using its constructors. For metalness worlkflow use GBufferDefault() constructor (for specular workflow you should use GBufferSpecular structure and GBufferSpecularDefault() constructor respectively).

The following example shows the way of creating GBuffer structure for both workflows by using #ifdef #else #endif preprocessor statements.

UUSL
/* ... */
	#ifdef METALNESS
		GBuffer gbuffer = GBufferDefault();
		#define GBUFFER gbuffer
	#else
		GBufferSpecular gbuffer_s = GBufferSpecularDefault();
		#define GBUFFER gbuffer_s
	#endif
/* ... */
Notice
Defining the GBUFFER with #define directive is handy to get access to GBuffer structure, no matter what type of the workflow is used.

Filling the GBuffer Structure#

After defining and initializing the GBuffer structure (like in an example above), you can easily fill the GBuffer's fields. You can fill the specific channel of the GBuffer texture.

UUSL
/* ... */
	#ifdef METALNESS
		GBUFFER.albedo		= color.rgb;
		GBUFFER.metalness	= shading.r;
		GBUFFER.roughness	= shading.g;
		
	#else
		GBUFFER.diffuse		= color.rgb;
		GBUFFER.specular	= shading.rgb;
		GBUFFER.gloss		= shading.a;
		GBUFFER.microfiber	= m_microfiber;
		
	#endif
/* ... */

Loading Textures to GBuffer Structure#

Another way of filling the GBuffer structure is using GBuffer functions for textures loading.

In case of changing GBuffer structure fields, these loading functions will perform the same function and allows to prevent possible errors during migration to another Unigine Engine version.

UUSL
// initialize textures
/* ... */
INIT_TEXTURE(1,TEX_NORMAL)
INIT_TEXTURE(2,TEX_ALBEDO)
INIT_TEXTURE(3,TEX_SHADING)
/* ... */

/* ... */
GBuffer gbuffer = GBufferDefault();
loadGBufferAlbedo(gbuffer, TEXTURE_OUT(TEX_ALBEDO),uv);
loadGBufferShading(gbuffer, TEXTURE_OUT(TEX_SHADING),uv);
loadGBufferNormal(gbuffer, TEXTURE_OUT(TEX_NORMAL),uv);
/* ... */
Last update: 2018-06-04