pbr: support ambient occlusion maps
AO maps modulate environment light
This commit is contained in:
parent
ecbf95ae31
commit
e471837d4e
6 changed files with 28 additions and 16 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue