parent
d2d48e2a7a
commit
f5277e347d
5 changed files with 107 additions and 62 deletions
|
@ -3515,7 +3515,6 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo); // copy to base level
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo); // copy to base level
|
||||||
_copy_screen();
|
_copy_screen();
|
||||||
|
|
||||||
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_FAR_BLUR, false);
|
|
||||||
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_FAR_BLUR, false);
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_FAR_BLUR, false);
|
||||||
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_QUALITY_LOW, false);
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_QUALITY_LOW, false);
|
||||||
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_QUALITY_MEDIUM, false);
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::DOF_QUALITY_MEDIUM, false);
|
||||||
|
@ -3611,6 +3610,16 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
||||||
composite_from = storage->frame.current_rt->effects.mip_maps[0].color;
|
composite_from = storage->frame.current_rt->effects.mip_maps[0].color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (env->dof_blur_near_enabled || env->dof_blur_far_enabled) {
|
||||||
|
//these needed to disable filtering, reenamble
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
}
|
||||||
|
|
||||||
if (env->auto_exposure) {
|
if (env->auto_exposure) {
|
||||||
|
|
||||||
//compute auto exposure
|
//compute auto exposure
|
||||||
|
|
|
@ -6189,6 +6189,8 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) {
|
||||||
glBindTexture(GL_TEXTURE_2D, rt->effects.mip_maps[i].color);
|
glBindTexture(GL_TEXTURE_2D, rt->effects.mip_maps[i].color);
|
||||||
|
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
int fb_w = w;
|
||||||
|
int fb_h = h;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
|
@ -6206,13 +6208,15 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) {
|
||||||
level++;
|
level++;
|
||||||
}
|
}
|
||||||
|
|
||||||
glTexStorage2DCustom(GL_TEXTURE_2D, level + 1, color_internal_format, rt->width, rt->height, color_format, color_type);
|
glTexStorage2DCustom(GL_TEXTURE_2D, level + 1, color_internal_format, fb_w, fb_h, color_format, color_type);
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
|
||||||
glDisable(GL_SCISSOR_TEST);
|
glDisable(GL_SCISSOR_TEST);
|
||||||
glColorMask(1, 1, 1, 1);
|
glColorMask(1, 1, 1, 1);
|
||||||
glDepthMask(GL_TRUE);
|
if (rt->buffers.active == false) {
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
for (int j = 0; j < rt->effects.mip_maps[i].sizes.size(); j++) {
|
for (int j = 0; j < rt->effects.mip_maps[i].sizes.size(); j++) {
|
||||||
|
|
||||||
|
@ -6235,7 +6239,6 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) {
|
||||||
|
|
||||||
float zero[4] = { 1, 0, 1, 0 };
|
float zero[4] = { 1, 0, 1, 0 };
|
||||||
glViewport(0, 0, rt->effects.mip_maps[i].sizes[j].width, rt->effects.mip_maps[i].sizes[j].height);
|
glViewport(0, 0, rt->effects.mip_maps[i].sizes[j].width, rt->effects.mip_maps[i].sizes[j].height);
|
||||||
|
|
||||||
glClearBufferfv(GL_COLOR, 0, zero);
|
glClearBufferfv(GL_COLOR, 0, zero);
|
||||||
if (used_depth) {
|
if (used_depth) {
|
||||||
glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0, 0);
|
glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0, 0);
|
||||||
|
|
|
@ -1285,12 +1285,11 @@ public:
|
||||||
buffers.fbo = 0;
|
buffers.fbo = 0;
|
||||||
used_in_frame = false;
|
used_in_frame = false;
|
||||||
|
|
||||||
flags[RENDER_TARGET_VFLIP] = false;
|
for (int i = 0; i < RENDER_TARGET_FLAG_MAX; i++) {
|
||||||
flags[RENDER_TARGET_TRANSPARENT] = false;
|
flags[i] = false;
|
||||||
flags[RENDER_TARGET_NO_3D_EFFECTS] = false;
|
}
|
||||||
flags[RENDER_TARGET_NO_3D] = false;
|
|
||||||
flags[RENDER_TARGET_NO_SAMPLING] = false;
|
|
||||||
flags[RENDER_TARGET_HDR] = true;
|
flags[RENDER_TARGET_HDR] = true;
|
||||||
|
|
||||||
buffers.active = false;
|
buffers.active = false;
|
||||||
buffers.effects_active = false;
|
buffers.effects_active = false;
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,38 @@ vec4 texture2D_bicubic(sampler2D tex, vec2 uv,int p_lod)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
vec3 tonemap_filmic(vec3 color,float white) {
|
||||||
|
|
||||||
|
float A = 0.15;
|
||||||
|
float B = 0.50;
|
||||||
|
float C = 0.10;
|
||||||
|
float D = 0.20;
|
||||||
|
float E = 0.02;
|
||||||
|
float F = 0.30;
|
||||||
|
float W = 11.2;
|
||||||
|
|
||||||
|
vec3 coltn = ((color*(A*color+C*B)+D*E)/(color*(A*color+B)+D*F))-E/F;
|
||||||
|
float whitetn = ((white*(A*white+C*B)+D*E)/(white*(A*white+B)+D*F))-E/F;
|
||||||
|
|
||||||
|
return coltn/whitetn;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 tonemap_aces(vec3 color) {
|
||||||
|
float a = 2.51f;
|
||||||
|
float b = 0.03f;
|
||||||
|
float c = 2.43f;
|
||||||
|
float d = 0.59f;
|
||||||
|
float e = 0.14f;
|
||||||
|
return color = clamp((color*(a*color+b))/(color*(c*color+d)+e),vec3(0.0),vec3(1.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 tonemap_reindhart(vec3 color,vec3 white) {
|
||||||
|
|
||||||
|
return ( color * ( 1.0 + ( color / ( white) ) ) ) / ( 1.0 + color );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
||||||
ivec2 coord = ivec2(gl_FragCoord.xy);
|
ivec2 coord = ivec2(gl_FragCoord.xy);
|
||||||
|
@ -157,8 +189,11 @@ void main() {
|
||||||
|
|
||||||
color*=exposure;
|
color*=exposure;
|
||||||
|
|
||||||
|
|
||||||
#if defined(USE_GLOW_LEVEL1) || defined(USE_GLOW_LEVEL2) || defined(USE_GLOW_LEVEL3) || defined(USE_GLOW_LEVEL4) || defined(USE_GLOW_LEVEL5) || defined(USE_GLOW_LEVEL6) || defined(USE_GLOW_LEVEL7)
|
#if defined(USE_GLOW_LEVEL1) || defined(USE_GLOW_LEVEL2) || defined(USE_GLOW_LEVEL3) || defined(USE_GLOW_LEVEL4) || defined(USE_GLOW_LEVEL5) || defined(USE_GLOW_LEVEL6) || defined(USE_GLOW_LEVEL7)
|
||||||
|
#define USING_GLOW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USING_GLOW)
|
||||||
vec3 glow = vec3(0.0);
|
vec3 glow = vec3(0.0);
|
||||||
|
|
||||||
#ifdef USE_GLOW_LEVEL1
|
#ifdef USE_GLOW_LEVEL1
|
||||||
|
@ -193,8 +228,55 @@ void main() {
|
||||||
|
|
||||||
glow *= glow_intensity;
|
glow *= glow_intensity;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_REINDHART_TONEMAPPER
|
||||||
|
|
||||||
|
color.rgb = tonemap_reindhart(color.rgb,white);
|
||||||
|
|
||||||
|
# if defined(USING_GLOW)
|
||||||
|
glow = tonemap_reindhart(glow,white);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_FILMIC_TONEMAPPER
|
||||||
|
|
||||||
|
color.rgb = tonemap_filmic(color.rgb,white);
|
||||||
|
|
||||||
|
# if defined(USING_GLOW)
|
||||||
|
glow = tonemap_filmic(glow,white);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ACES_TONEMAPPER
|
||||||
|
|
||||||
|
color.rgb = tonemap_aces(color.rgb);
|
||||||
|
|
||||||
|
# if defined(USING_GLOW)
|
||||||
|
glow = tonemap_aces(glow);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//regular Linear -> SRGB conversion
|
||||||
|
vec3 a = vec3(0.055);
|
||||||
|
color.rgb = mix( (vec3(1.0)+a)*pow(color.rgb,vec3(1.0/2.4))-a , 12.92*color.rgb , lessThan(color.rgb,vec3(0.0031308)));
|
||||||
|
|
||||||
|
#if defined(USING_GLOW)
|
||||||
|
glow = mix( (vec3(1.0)+a)*pow(glow,vec3(1.0/2.4))-a , 12.92*glow , lessThan(glow,vec3(0.0031308)));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//glow needs to be added in SRGB space (together with image space effects)
|
||||||
|
|
||||||
|
color.rgb = clamp(color.rgb,0.0,1.0);
|
||||||
|
|
||||||
|
#if defined(USING_GLOW)
|
||||||
|
glow = clamp(glow,0.0,1.0);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_GLOW_REPLACE
|
#ifdef USE_GLOW_REPLACE
|
||||||
|
|
||||||
color.rgb = glow;
|
color.rgb = glow;
|
||||||
|
@ -203,7 +285,7 @@ void main() {
|
||||||
|
|
||||||
#ifdef USE_GLOW_SCREEN
|
#ifdef USE_GLOW_SCREEN
|
||||||
|
|
||||||
color.rgb = clamp((color.rgb + glow) - (color.rgb * glow), 0.0, 1.0);
|
color.rgb = max((color.rgb + glow) - (color.rgb * glow), vec3(0.0));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -219,60 +301,11 @@ void main() {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(USE_GLOW_SCREEN) && !defined(USE_GLOW_SOFTLIGHT) && !defined(USE_GLOW_REPLACE)
|
#if defined(USING_GLOW) && !defined(USE_GLOW_SCREEN) && !defined(USE_GLOW_SOFTLIGHT) && !defined(USE_GLOW_REPLACE)
|
||||||
|
//additive
|
||||||
color.rgb+=glow;
|
color.rgb+=glow;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_REINDHART_TONEMAPPER
|
|
||||||
|
|
||||||
{
|
|
||||||
color.rgb = ( color.rgb * ( 1.0 + ( color.rgb / ( white) ) ) ) / ( 1.0 + color.rgb );
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_FILMIC_TONEMAPPER
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
float A = 0.15;
|
|
||||||
float B = 0.50;
|
|
||||||
float C = 0.10;
|
|
||||||
float D = 0.20;
|
|
||||||
float E = 0.02;
|
|
||||||
float F = 0.30;
|
|
||||||
float W = 11.2;
|
|
||||||
|
|
||||||
vec3 coltn = ((color.rgb*(A*color.rgb+C*B)+D*E)/(color.rgb*(A*color.rgb+B)+D*F))-E/F;
|
|
||||||
float whitetn = ((white*(A*white+C*B)+D*E)/(white*(A*white+B)+D*F))-E/F;
|
|
||||||
|
|
||||||
color.rgb=coltn/whitetn;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_ACES_TONEMAPPER
|
|
||||||
|
|
||||||
{
|
|
||||||
float a = 2.51f;
|
|
||||||
float b = 0.03f;
|
|
||||||
float c = 2.43f;
|
|
||||||
float d = 0.59f;
|
|
||||||
float e = 0.14f;
|
|
||||||
color.rgb = clamp((color.rgb*(a*color.rgb+b))/(color.rgb*(c*color.rgb+d)+e),vec3(0.0),vec3(1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//regular Linear -> SRGB conversion
|
|
||||||
vec3 a = vec3(0.055);
|
|
||||||
color.rgb = mix( (vec3(1.0)+a)*pow(color.rgb,vec3(1.0/2.4))-a , 12.92*color.rgb , lessThan(color.rgb,vec3(0.0031308)));
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_BCS
|
#ifdef USE_BCS
|
||||||
|
|
||||||
color.rgb = mix(vec3(0.0),color.rgb,bcs.x);
|
color.rgb = mix(vec3(0.0),color.rgb,bcs.x);
|
||||||
|
|
|
@ -167,6 +167,7 @@ void Environment::set_tonemap_auto_exposure(bool p_enabled) {
|
||||||
|
|
||||||
tonemap_auto_exposure = p_enabled;
|
tonemap_auto_exposure = p_enabled;
|
||||||
VS::get_singleton()->environment_set_tonemap(environment, VS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey);
|
VS::get_singleton()->environment_set_tonemap(environment, VS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey);
|
||||||
|
_change_notify();
|
||||||
}
|
}
|
||||||
bool Environment::get_tonemap_auto_exposure() const {
|
bool Environment::get_tonemap_auto_exposure() const {
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue