added radiance when using clear color and fixed brdf
This commit is contained in:
parent
f52c294a74
commit
5c252092e1
4 changed files with 54 additions and 44 deletions
|
@ -2430,6 +2430,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
|
|||
|
||||
if (p_env) {
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::BG_ENERGY, p_env->bg_energy);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::BG_COLOR, p_env->bg_color);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_SKY_CONTRIBUTION, p_env->ambient_sky_contribution);
|
||||
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_COLOR, p_env->ambient_color);
|
||||
|
@ -2437,6 +2438,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
|
|||
|
||||
} else {
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::BG_ENERGY, 1.0);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::BG_COLOR, state.default_bg);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_SKY_CONTRIBUTION, 1.0);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_COLOR, state.default_ambient);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::AMBIENT_ENERGY, 1.0);
|
||||
|
@ -2539,7 +2541,6 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
|
|||
state.scene_shader.set_conditional(SceneShaderGLES2::USE_LIGHTMAP_CAPTURE, false);
|
||||
state.scene_shader.set_conditional(SceneShaderGLES2::FOG_DEPTH_ENABLED, false);
|
||||
state.scene_shader.set_conditional(SceneShaderGLES2::FOG_HEIGHT_ENABLED, false);
|
||||
state.scene_shader.set_conditional(SceneShaderGLES2::USE_RADIANCE_MAP, false);
|
||||
state.scene_shader.set_conditional(SceneShaderGLES2::USE_DEPTH_PREPASS, false);
|
||||
}
|
||||
|
||||
|
@ -2786,6 +2787,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
|
|||
}
|
||||
|
||||
state.default_ambient = Color(clear_color.r, clear_color.g, clear_color.b, 1.0);
|
||||
state.default_bg = Color(clear_color.r, clear_color.g, clear_color.b, 1.0);
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
|
@ -2825,6 +2827,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
|
|||
if (probe_interior) {
|
||||
env_radiance_tex = 0; //do not use radiance texture on interiors
|
||||
state.default_ambient = Color(0, 0, 0, 1); //black as default ambient for interior
|
||||
state.default_bg = Color(0, 0, 0, 1); //black as default background for interior
|
||||
}
|
||||
|
||||
// render opaque things first
|
||||
|
|
|
@ -104,6 +104,7 @@ public:
|
|||
|
||||
GLuint immediate_buffer;
|
||||
Color default_ambient;
|
||||
Color default_bg;
|
||||
|
||||
// ResolveShaderGLES3 resolve_shader;
|
||||
// ScreenSpaceReflectionShaderGLES3 ssr_shader;
|
||||
|
|
|
@ -911,6 +911,7 @@ uniform mat4 radiance_inverse_xform;
|
|||
|
||||
#endif
|
||||
|
||||
uniform vec4 bg_color;
|
||||
uniform float bg_energy;
|
||||
|
||||
uniform float ambient_sky_contribution;
|
||||
|
@ -1553,7 +1554,6 @@ FRAGMENT_SHADER_CODE
|
|||
ref_vec.z *= -1.0;
|
||||
|
||||
specular_light = textureCubeLod(radiance_map, ref_vec, roughness * RADIANCE_MAX_LOD).xyz * bg_energy;
|
||||
|
||||
{
|
||||
vec3 ambient_dir = normalize((radiance_inverse_xform * vec4(normal, 0.0)).xyz);
|
||||
vec3 env_ambient = textureCubeLod(radiance_map, ambient_dir, RADIANCE_MAX_LOD).xyz * bg_energy;
|
||||
|
@ -1564,6 +1564,7 @@ FRAGMENT_SHADER_CODE
|
|||
#else
|
||||
|
||||
ambient_light = ambient_color.rgb;
|
||||
specular_light = bg_color.rgb * bg_energy;
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1622,6 +1623,19 @@ FRAGMENT_SHADER_CODE
|
|||
|
||||
#endif // defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2)
|
||||
|
||||
// scales the specular reflections, needs to be be computed before lighting happens,
|
||||
// but after environment and reflection probes are added
|
||||
//TODO: this curve is not really designed for gammaspace, should be adjusted
|
||||
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
||||
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
||||
vec4 r = roughness * c0 + c1;
|
||||
float ndotv = clamp(dot(normal, eye_position), 0.0, 1.0);
|
||||
float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
|
||||
vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
|
||||
|
||||
vec3 f0 = F0(metallic, specular, albedo);
|
||||
specular_light *= env.x * f0 + env.y;
|
||||
|
||||
#ifdef USE_LIGHTMAP
|
||||
//ambient light will come entirely from lightmap is lightmap is used
|
||||
ambient_light = texture2D(lightmap, uv2_interp).rgb * lightmap_energy;
|
||||
|
@ -2059,17 +2073,6 @@ FRAGMENT_SHADER_CODE
|
|||
#if defined(DIFFUSE_TOON)
|
||||
//simplify for toon, as
|
||||
specular_light *= specular * metallic * albedo * 2.0;
|
||||
#else
|
||||
//TODO: this curve is not really designed for gammaspace, should be adjusted
|
||||
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
||||
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
||||
vec4 r = roughness * c0 + c1;
|
||||
float ndotv = clamp(dot(normal, eye_position), 0.0, 1.0);
|
||||
float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
|
||||
vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
|
||||
|
||||
vec3 f0 = F0(metallic, specular, albedo);
|
||||
specular_light *= env.x * f0 + env.y;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1802,6 +1802,7 @@ FRAGMENT_SHADER_CODE
|
|||
ambient_light = vec3(0.0, 0.0, 0.0);
|
||||
#else
|
||||
ambient_light = ambient_light_color.rgb;
|
||||
env_reflection_light = bg_color.rgb * bg_energy;
|
||||
#endif //AMBIENT_LIGHT_DISABLED
|
||||
|
||||
#endif
|
||||
|
@ -1813,6 +1814,39 @@ FRAGMENT_SHADER_CODE
|
|||
specular_blob_intensity *= specular * 2.0;
|
||||
#endif
|
||||
|
||||
#ifdef USE_FORWARD_LIGHTING
|
||||
|
||||
highp vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
highp vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
for (int i = 0; i < reflection_count; i++) {
|
||||
reflection_process(reflection_indices[i], vertex, normal, binormal, tangent, roughness, anisotropy, ambient_light, env_reflection_light, reflection_accum, ambient_accum);
|
||||
}
|
||||
|
||||
if (reflection_accum.a > 0.0) {
|
||||
specular_light += reflection_accum.rgb / reflection_accum.a;
|
||||
} else {
|
||||
specular_light += env_reflection_light;
|
||||
}
|
||||
#if !defined(USE_LIGHTMAP) && !defined(USE_LIGHTMAP_CAPTURE)
|
||||
if (ambient_accum.a > 0.0) {
|
||||
ambient_light = ambient_accum.rgb / ambient_accum.a;
|
||||
}
|
||||
#endif
|
||||
|
||||
// scales the specular reflections, needs to be be computed before lighting happens,
|
||||
// but after environment and reflection probes are added
|
||||
// Environment brdf approximation (Lazarov 2013)
|
||||
// see https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile
|
||||
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
||||
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
||||
vec4 r = roughness * c0 + c1;
|
||||
float ndotv = clamp(dot(normal, eye_vec), 0.0, 1.0);
|
||||
float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
|
||||
vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
|
||||
|
||||
vec3 f0 = F0(metallic, specular, albedo);
|
||||
env_reflection_light *= env.x * f0 + env.y;
|
||||
|
||||
#if defined(USE_LIGHT_DIRECTIONAL)
|
||||
|
||||
vec3 light_attenuation = vec3(1.0);
|
||||
|
@ -2004,25 +2038,6 @@ FRAGMENT_SHADER_CODE
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_FORWARD_LIGHTING
|
||||
|
||||
highp vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
highp vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
for (int i = 0; i < reflection_count; i++) {
|
||||
reflection_process(reflection_indices[i], vertex, normal, binormal, tangent, roughness, anisotropy, ambient_light, env_reflection_light, reflection_accum, ambient_accum);
|
||||
}
|
||||
|
||||
if (reflection_accum.a > 0.0) {
|
||||
specular_light += reflection_accum.rgb / reflection_accum.a;
|
||||
} else {
|
||||
specular_light += env_reflection_light;
|
||||
}
|
||||
#if !defined(USE_LIGHTMAP) && !defined(USE_LIGHTMAP_CAPTURE)
|
||||
if (ambient_accum.a > 0.0) {
|
||||
ambient_light = ambient_accum.rgb / ambient_accum.a;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_VERTEX_LIGHTING
|
||||
|
||||
diffuse_light *= albedo;
|
||||
|
@ -2063,18 +2078,6 @@ FRAGMENT_SHADER_CODE
|
|||
#if defined(DIFFUSE_TOON)
|
||||
//simplify for toon, as
|
||||
specular_light *= specular * metallic * albedo * 2.0;
|
||||
#else
|
||||
// Environment brdf approximation (Lazarov 2013)
|
||||
// see https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile
|
||||
const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
|
||||
const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
|
||||
vec4 r = roughness * c0 + c1;
|
||||
float ndotv = clamp(dot(normal, eye_vec), 0.0, 1.0);
|
||||
float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
|
||||
vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
|
||||
|
||||
vec3 f0 = F0(metallic, specular, albedo);
|
||||
specular_light *= env.x * f0 + env.y;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue