Структура UUSL GBuffer
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 rendering pipeline. G-буфер - это серия текстур, в которую записана вся видимая информация: цвет альбедо, нормали, карта освещения и т.д. G-буфер используется для конвейера отложенного рендеринга .
UUSL has a handy GBuffer structure to fill it in the shader's code. UUSL имеет удобную структуру GBuffer, которую вы можете заполнить в коде шейдера.
GBuffer TexturesТекстуры GBuffer#
GBuffer has the following set of textures: GBuffer имеет следующий набор текстур:
Имя текстуры | Тип | Описание |
---|---|---|
Albedo | RGBA8 | RGB - albedo value.
A - occlusion value. RGB - значение альбедо. A - значение окклюзии. |
Shading | RGBA8 | R - metalness value.
G - F0 (specular) value. B - translucent value. A - microfiber value. R - значение металличности. G - значение F0 (зеркальное отражение). B - значение полупрозрачности. A - значение микрофибры. |
Normal | RGBA8 | RGB - normal value.
A - roughness value. RGB - нормальное значение. A - значение шероховатости. |
Velocity | RG16F | RG - pixel displacement value (XY coordinates). RG - значение смещения пикселя (координаты XY). |
Material Mask | R32U | R - material mask value. R - значение маски материала. |
Lightmap | RG11B10F | RGB - lightmap value. RGB - значение карты освещения. |
Features | RGBA8 | R - значение фаски. |
Channels of these textures fill the corresponding fields of the GBuffer and GBufferSpecular structures. Каналы этих текстур заполняют соответствующие поля структуры GBuffer.
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 имеет разные поля:
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;
};
Чтобы преобразовать Specular G-buffer в Metalness G-buffer, используйте функцию specularToMetalness().
GBuffer FunctionsФункции GBuffer#
GBuffer GBufferDefault ( ) #
Default constructor for GBuffer structure for metalness workflow. It creates an instance with default (not null) values. Конструктор по умолчанию для структуры GBuffer для рабочего процесса metalness. Он создает экземпляр со значениями по умолчанию (не нулевыми).Возвращаемое значение
GBuffer structure with default (not null) values. Структура GBuffer со значениями по умолчанию (не нулевыми).GBufferSpecular GBufferSpecularDefault ( ) #
Constructor for GBuffferSpecular structure for specular workflow. It creates an instance with default (not null) values. Конструктор структуры GBuffferSpecular для Specular подхода. Он создает экземпляр со значениями по умолчанию (не нулевыми).Возвращаемое значение
GBufferSpecular structure with default (not null) values. Структура GBufferSpecular со значениями по умолчанию (не нулевыми).void shadingGBuffer ( inout GBuffer gbuffer, float3 view ) #
Добавляет зависящее от вида затенение в gbuffer.Аргументы
- inout GBuffer gbuffer - Экземпляр GBuffer.
- float3 view - Вектор направления взгляда.
void shadingGBuffer ( inout GBuffer gbuffer ) #
Добавляет затенение, зависящее от параметров материала.Аргументы
- inout GBuffer gbuffer - Экземпляр GBuffer.
GBuffer specularToMetalness ( GBufferSpecular gbuffer ) #
Converts given specular GBufferSpecular to metalness Gbuffer. Преобразует заданный зеркальный GBufferSpecular в металлический Gbuffer.Аргументы
- GBufferSpecular gbuffer - Specular GBufferSpecular instance to be converted. Экземпляр Specular GBufferSpecular для преобразования.
Возвращаемое значение
Metalness Gbuffer instance. Экземпляр Metalness Gbuffer.void setGBuffer ( GBuffer gbuffer ) #
Sets GBuffer values by using corresponding values of given GBuffer instance. Устанавливает значения GBuffer, используя соответствующие значения данного экземпляра GBuffer.Аргументы
- GBuffer gbuffer - GBuffer instance with necessary values to be set. Экземпляр GBuffer с необходимыми значениями, которые необходимо установить.
void setGBuffer ( GBufferSpecular gbuffer ) #
Sets GBuffer values by using corresponding values of given GBufferSpecular instance.Inside this method specularToMetalness() is called. Устанавливает значения GBuffer, используя соответствующие значения данного экземпляра GBufferSpecular.
Внутри этого метода вызывается specularToMetalness () .
Аргументы
- GBufferSpecular gbuffer - GBufferSpecular instance with necessary values to be set. Экземпляр GBufferSpecular с необходимыми значениями, которые нужно установить.
void loadGBufferAlbedo ( inout GBuffer gbuffer, TEXTURE_IN TEX_ALBEDO, float2 uv ) #
Loads albedo texture values (albedo color and occlusion) to GBuffer. Загружает значения текстуры альбедо (цвет и окклюзию альбедо) в GBuffer.Аргументы
- inout GBuffer gbuffer - Gbuffer structure. Values will be written in it. Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN TEX_ALBEDO - Albedo texture. Текстура Альбедо.
- float2 uv - UV coordinates. UV-координаты.
void loadGBufferShading ( inout GBuffer gbuffer, TEXTURE_IN TEX_SHADING, float2 uv ) #
Loads shading texture values (metalness, f0, translucence, microfiber) to GBuffer. Загружает значения текстуры затенения (металличность, f0, полупрозрачность, микрофибра) в GBuffer.Аргументы
- inout GBuffer gbuffer - Gbuffer structure. Values will be written in it. Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN TEX_SHADING - Shading texture. Затенение текстуры.
- float2 uv - UV coordinates. UV-координаты.
void loadGBufferNormal ( inout GBuffer gbuffer, TEXTURE_IN TEX_NORMAL, float2 uv ) #
Loads normal texture values (normal and roughness) to GBuffer. Загружает значения нормальной текстуры (нормаль и шероховатость) в GBuffer.Аргументы
- inout GBuffer gbuffer - Gbuffer structure. Values will be written in it. Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN TEX_NORMAL - Normal texture. Обычная текстура.
- float2 uv - UV coordinates. UV-координаты.
void loadGBufferLightMap ( inout GBuffer gbuffer, TEXTURE_IN TEX_LIGHTMAP, float2 uv ) #
Загружает значения текстуры карты освещения в переданный экземпляр GBuffer.Аргументы
- inout GBuffer gbuffer - Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN TEX_LIGHTMAP - Текстура карты освещения.
- float2 uv - UV-координаты.
void loadGBufferVelocity ( inout GBuffer gbuffer, TEXTURE_IN TEX_VELOCITY, float2 uv ) #
Загружает значения текстуры скорости в переданный экземпляр GBuffer.Аргументы
- inout GBuffer gbuffer - Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN TEX_VELOCITY - Текстура скорости.
- float2 uv - UV-координаты.
void loadGBufferMaterialMask ( inout GBuffer gbuffer, TEXTURE_IN_UINT TEX_MATERIAL_MASK, float2 uv ) #
Загружает значения текстуры маски материала в переданный экземпляр GBuffer.Аргументы
- inout GBuffer gbuffer - Структура Gbuffer. В нем будут записаны значения.
- TEXTURE_IN_UINT TEX_MATERIAL_MASK - Текстура маски материала.
- float2 uv - UV-координаты.
Usage ExampleПример использования#
Defining the GBuffer StructureОпределение структуры GBuffer#
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). Чтобы использовать структуру GBuffer в коде шейдера, вы должны определить и инициализировать структуру GBuffer с помощью ее конструкторов. Для металлического рабочего процесса используйте конструктор GBufferDefault() (для зеркального рабочего процесса вы должны использовать структуру GBufferSpecular и конструктор GBufferSpecularDefault () соответственно).
The following example shows the way of creating GBuffer structure for both workflows by using #ifdef #else #endif preprocessor statements. В следующем примере показан способ создания структуры GBuffer для обоих рабочих процессов с использованием инструкций препроцессора #ifdef #else #endif.
/* ... */
#ifdef METALNESS
GBuffer gbuffer = GBufferDefault();
#define GBUFFER gbuffer
#else
GBufferSpecular gbuffer_s = GBufferSpecularDefault();
#define GBUFFER gbuffer_s
#endif
/* ... */
Filling the GBuffer StructureЗаполнение структуры GBuffer#
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. После определения и инициализации структуры GBuffer (как в примере выше) вы можете легко заполнить поля GBuffer. Вы можете заполнить определенный канал текстуры GBuffer.
/* ... */
#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Загрузка текстур в структуру GBuffer#
Another way of filling the GBuffer structure is using GBuffer functions for textures loading. Другой способ заполнения структуры GBuffer - использование функций GBuffer для загрузки текстур.
In case of changing GBuffer structure fields, these loading functions will perform the same function, preventing possible errors during migration to another UNIGINE Engine version. В случае изменения полей структуры GBuffer эти функции загрузки будут выполнять ту же функцию, предотвращая возможные ошибки во время миграции на другую версию UNIGINE Engine.
// 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);
/* ... */