pbr: support ambient occlusion maps

AO maps modulate environment light
This commit is contained in:
Andrei Alexeyev 2021-08-04 03:57:39 +03:00
parent ecbf95ae31
commit e471837d4e
No known key found for this signature in database
GPG key ID: 72D26128040B9690
6 changed files with 28 additions and 16 deletions

View file

@ -10,6 +10,7 @@
#define PBR_FEATURE_ROUGHNESS_MAP 8
#define PBR_FEATURE_ENVIRONMENT_MAP 16
#define PBR_FEATURE_DEPTH_MAP 32
#define PBR_FEATURE_AO_MAP 64
UNIFORM(1) int features_mask;
@ -19,18 +20,19 @@ UNIFORM(4) sampler2D ambient_map;
UNIFORM(5) sampler2D roughness_map;
UNIFORM(6) samplerCube environment_map;
UNIFORM(7) sampler2D depth_map;
UNIFORM(8) sampler2D ibl_brdf_lut;
UNIFORM(8) sampler2D ao_map;
UNIFORM(9) sampler2D ibl_brdf_lut;
// These either modulate their respective maps, or are used instead of them
UNIFORM(9) vec4 diffuseRGB_metallicA;
UNIFORM(10) vec4 ambientRGB_roughnessA;
UNIFORM(11) float depth_scale;
UNIFORM(10) vec4 diffuseRGB_metallicA;
UNIFORM(11) vec4 ambientRGB_roughnessA;
UNIFORM(12) float depth_scale;
UNIFORM(12) mat4 inv_camera_transform; // only used if PBR_FEATURE_ENVIRONMENT_MAP is set
UNIFORM(13) mat4 inv_camera_transform; // only used if PBR_FEATURE_ENVIRONMENT_MAP is set
UNIFORM(13) int light_count;
UNIFORM(14) vec3 light_positions[PBR_MAX_LIGHTS];
UNIFORM(20) vec3 light_colors[PBR_MAX_LIGHTS]; // layout-id also depends on PBR_MAX_LIGHTS
UNIFORM(14) int light_count;
UNIFORM(15) vec3 light_positions[PBR_MAX_LIGHTS];
UNIFORM(21) vec3 light_colors[PBR_MAX_LIGHTS]; // layout-id also depends on PBR_MAX_LIGHTS
VARYING(3) vec3 pos;
VARYING(4) vec3 tangent;

View file

@ -14,12 +14,6 @@ void main(void) {
if(bool(features_mask & PBR_FEATURE_DEPTH_MAP)) {
vec3 vdir = normalize(transpose(tbn) * -pos);
uv = parallaxOcclusionMap(depth_map, depth_scale, uv, vdir);
/*
if(uv.x > 1.0 || uv.y > 1.0 || uv.x < 0.0 || uv.y < 0.0) {
discard;
}
*/
}
if(bool(features_mask & PBR_FEATURE_ROUGHNESS_MAP)) {
@ -73,7 +67,13 @@ void main(void) {
}
if(bool(features_mask & PBR_FEATURE_ENVIRONMENT_MAP)) {
color += PBR_EnvironmentLight(pbr, ibl_brdf_lut, environment_map);
vec3 envLight = PBR_EnvironmentLight(pbr, ibl_brdf_lut, environment_map);
if(bool(features_mask & PBR_FEATURE_AO_MAP)) {
envLight *= texture(ao_map, uv).r;
}
color += envLight;
}
color = PBR_TonemapReinhard(color);

View file

@ -45,9 +45,10 @@ struct mat_load_data {
char *ambient_map;
char *roughness_map;
char *depth_map;
char *ao_map;
};
char *maps[5];
char *maps[6];
};
};
@ -78,6 +79,7 @@ static void material_load_stage1(ResourceLoadState *st) {
{ "ambient_map", .out_str = &ld->ambient_map },
{ "roughness_map", .out_str = &ld->roughness_map },
{ "depth_map", .out_str = &ld->depth_map },
{ "ao_map", .out_str = &ld->ao_map },
{ "diffuse_color", .callback = kvparser_vec3, .callback_data = ld->mat->diffuse_color },
{ "ambient_color", .callback = kvparser_vec3, .callback_data = ld->mat->ambient_color },
{ "roughness", .out_float = &ld->mat->roughness_value },
@ -119,6 +121,7 @@ static void material_load_stage2(ResourceLoadState *st) {
LOADMAP(ambient);
LOADMAP(roughness);
LOADMAP(depth);
LOADMAP(ao);
res_load_finished(st, ld->mat);
free_mat_load_data(ld);

View file

@ -18,6 +18,7 @@ typedef struct PBRMaterial {
Texture *ambient_map;
Texture *roughness_map;
Texture *depth_map;
Texture *ao_map;
vec3 diffuse_color;
vec3 ambient_color;

View file

@ -172,6 +172,11 @@ void pbr_set_material_uniforms(const PBRMaterial *m, const PBREnvironment *env)
flags |= PBR_FEATURE_ENVIRONMENT_MAP;
}
if(m->ao_map) {
r_uniform_sampler("ao_map", m->ao_map);
flags |= PBR_FEATURE_AO_MAP;
}
vec4 diffuseRGB_metallicA;
glm_vec3_copy((float*)m->diffuse_color, diffuseRGB_metallicA);
diffuseRGB_metallicA[3] = m->metallic_value;

View file

@ -55,6 +55,7 @@ typedef struct PointLight3D {
#define PBR_FEATURE_ROUGHNESS_MAP 8
#define PBR_FEATURE_ENVIRONMENT_MAP 16
#define PBR_FEATURE_DEPTH_MAP 32
#define PBR_FEATURE_AO_MAP 64
typedef struct PBREnvironment {
mat4 cam_inverse_transform;