@ -521,13 +521,7 @@ void RasterizerSceneGLES3::reflection_atlas_set_size(RID p_ref_atlas, int p_size
glBindTexture ( GL_TEXTURE_2D , reflection_atlas - > color ) ;
int mmsize = reflection_atlas - > size ;
for ( int i = 0 ; i < 6 ; i + + ) {
glTexImage2D ( GL_TEXTURE_2D , i , internal_format , mmsize , mmsize , 0 ,
format , type , NULL ) ;
mmsize > > = 1 ;
}
glTexStorage2DCustom ( GL_TEXTURE_2D , 6 , internal_format , mmsize , mmsize , format , type ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
@ -537,8 +531,6 @@ void RasterizerSceneGLES3::reflection_atlas_set_size(RID p_ref_atlas, int p_size
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_BASE_LEVEL , 0 ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAX_LEVEL , 5 ) ;
mmsize = reflection_atlas - > size ;
for ( int i = 0 ; i < 6 ; i + + ) {
glGenFramebuffers ( 1 , & reflection_atlas - > fbo [ i ] ) ;
glBindFramebuffer ( GL_FRAMEBUFFER , reflection_atlas - > fbo [ i ] ) ;
@ -1962,6 +1954,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADELESS , true ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_FORWARD_LIGHTING , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_VERTEX_LIGHTING , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_LIGHT_DIRECTIONAL , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : LIGHT_DIRECTIONAL_SHADOW , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : LIGHT_USE_PSSM4 , false ) ;
@ -1972,6 +1965,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADOW_MODE_PCF_13 , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_GI_PROBES , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_RADIANCE_MAP , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_CONTACT_SHADOWS , false ) ;
//state.scene_shader.set_conditional(SceneShaderGLES3::SHADELESS,true);
} else {
@ -1979,7 +1973,10 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_GI_PROBES , e - > instance - > gi_probe_instances . size ( ) > 0 ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADELESS , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_FORWARD_LIGHTING , ! p_directional_add ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_VERTEX_LIGHTING , ( e - > sort_key & SORT_KEY_VERTEX_LIT_FLAG ) ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_LIGHT_DIRECTIONAL , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : LIGHT_DIRECTIONAL_SHADOW , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : LIGHT_USE_PSSM4 , false ) ;
@ -1988,6 +1985,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADOW_MODE_PCF_5 , shadow_filter_mode = = SHADOW_FILTER_PCF5 ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADOW_MODE_PCF_13 , shadow_filter_mode = = SHADOW_FILTER_PCF13 ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_RADIANCE_MAP , use_radiance_map ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_CONTACT_SHADOWS , state . used_contact_shadows ) ;
if ( p_directional_add | | ( directional_light & & ( e - > sort_key & SORT_KEY_NO_DIRECTIONAL_FLAG ) = = 0 ) ) {
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_LIGHT_DIRECTIONAL , true ) ;
@ -2136,6 +2134,8 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADOW_MODE_PCF_5 , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : SHADOW_MODE_PCF_13 , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_GI_PROBES , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_CONTACT_SHADOWS , false ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_VERTEX_LIGHTING , false ) ;
}
void RasterizerSceneGLES3 : : _add_geometry ( RasterizerStorageGLES3 : : Geometry * p_geometry , InstanceBase * p_instance , RasterizerStorageGLES3 : : GeometryOwner * p_owner , int p_material , bool p_shadow ) {
@ -2281,6 +2281,11 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G
e - > sort_key | = SORT_KEY_UNSHADED_FLAG ;
}
if ( ! shadow & & ( m - > shader - > spatial . uses_vertex_lighting | | storage - > config . force_vertex_shading ) ) {
e - > sort_key | = SORT_KEY_VERTEX_LIT_FLAG ;
}
}
void RasterizerSceneGLES3 : : _draw_sky ( RasterizerStorageGLES3 : : Sky * p_sky , const CameraMatrix & p_projection , const Transform & p_transform , bool p_vflip , float p_scale , float p_energy ) {
@ -2912,7 +2917,19 @@ void RasterizerSceneGLES3::_setup_reflections(RID *p_reflection_probe_cull_resul
glBindBufferBase ( GL_UNIFORM_BUFFER , 6 , state . reflection_array_ubo ) ;
}
void RasterizerSceneGLES3 : : _copy_screen ( ) {
void RasterizerSceneGLES3 : : _copy_screen ( bool p_invalidate_color , bool p_invalidate_depth ) {
# ifndef GLES_OVER_GL
if ( p_invalidate_color ) {
GLenum attachments [ 2 ] = {
GL_COLOR_ATTACHMENT0 ,
GL_DEPTH_STENCIL_ATTACHMENT
} ;
glInvalidateFramebuffer ( GL_FRAMEBUFFER , p_invalidate_depth ? 2 : 1 , attachments ) ;
}
# endif
glBindVertexArray ( storage - > resources . quadie_array ) ;
glDrawArrays ( GL_TRIANGLE_FAN , 0 , 4 ) ;
@ -3080,7 +3097,7 @@ void RasterizerSceneGLES3::_blur_effect_buffer() {
glActiveTexture ( GL_TEXTURE0 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . color ) ; //previous level, since mipmaps[0] starts one level bigger
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 1 ] . sizes [ i ] . fbo ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : GAUSSIAN_HORIZONTAL , false ) ;
//vertical pass
@ -3091,7 +3108,7 @@ void RasterizerSceneGLES3::_blur_effect_buffer() {
glActiveTexture ( GL_TEXTURE0 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 1 ] . color ) ;
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ i + 1 ] . fbo ) ; //next level, since mipmaps[0] starts one level bigger
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : GAUSSIAN_VERTICAL , false ) ;
}
}
@ -3139,7 +3156,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . ssao . depth_mipmap_fbos [ i ] ) ; //copy to front first
glViewport ( 0 , 0 , ss [ 0 ] , ss [ 1 ] ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
}
ss [ 0 ] = storage - > frame . current_rt - > width ;
ss [ 1 ] = storage - > frame . current_rt - > height ;
@ -3191,7 +3208,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
Color white ( 1 , 1 , 1 , 1 ) ;
glClearBufferfv ( GL_COLOR , 0 , white . components ) ; // specular
_copy_screen ( ) ;
_copy_screen ( true ) ;
//do the batm, i mean blur
@ -3212,7 +3229,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
if ( i = = 0 ) {
glClearBufferfv ( GL_COLOR , 0 , white . components ) ; // specular
}
_copy_screen ( ) ;
_copy_screen ( true ) ;
}
}
@ -3229,7 +3246,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glActiveTexture ( GL_TEXTURE1 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . ssao . blur_red [ 0 ] ) ; //previous level, since mipmaps[0] starts one level bigger
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ) ; // copy to base level
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : SSAO_MERGE , false ) ;
} else {
@ -3278,14 +3295,14 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > fbo ) ; //copy to front first
_copy_screen ( ) ;
_copy_screen ( true ) ;
glActiveTexture ( GL_TEXTURE0 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > color ) ;
state . sss_shader . set_uniform ( SubsurfScatteringShaderGLES3 : : DIR , Vector2 ( 0 , 1 ) ) ;
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ) ; // copy to base level
_copy_screen ( ) ;
_copy_screen ( true ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . color ) ; //restore filter
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
@ -3337,7 +3354,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 1 ] . sizes [ 0 ] . fbo ) ;
glViewport ( 0 , 0 , ssr_w , ssr_h ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
glViewport ( 0 , 0 , storage - > frame . current_rt - > width , storage - > frame . current_rt - > height ) ;
}
@ -3368,7 +3385,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glBlendEquation ( GL_FUNC_ADD ) ;
glBlendFunc ( GL_ONE , GL_ONE ) ; //use additive to accumulate one over the other
_copy_screen ( ) ;
_copy_screen ( true ) ;
glDisable ( GL_BLEND ) ; //end additive
@ -3392,7 +3409,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
glActiveTexture ( GL_TEXTURE0 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . color ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : SIMPLE_COPY , false ) ;
}
@ -3413,13 +3430,16 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
//copy specular to front buffer
//copy diffuse to effect buffer
glReadBuffer ( GL_COLOR_ATTACHMENT0 ) ;
glBindFramebuffer ( GL_READ_FRAMEBUFFER , storage - > frame . current_rt - > buffers . fbo ) ;
glBindFramebuffer ( GL_DRAW_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ) ;
glBlitFramebuffer ( 0 , 0 , storage - > frame . current_rt - > width , storage - > frame . current_rt - > height , 0 , 0 , storage - > frame . current_rt - > width , storage - > frame . current_rt - > height , GL_COLOR_BUFFER_BIT , GL_NEAREST ) ;
if ( storage - > frame . current_rt - > buffers . active ) {
//transfer to effect buffer if using buffers, also resolve MSAA
glReadBuffer ( GL_COLOR_ATTACHMENT0 ) ;
glBindFramebuffer ( GL_READ_FRAMEBUFFER , storage - > frame . current_rt - > buffers . fbo ) ;
glBindFramebuffer ( GL_DRAW_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ) ;
glBlitFramebuffer ( 0 , 0 , storage - > frame . current_rt - > width , storage - > frame . current_rt - > height , 0 , 0 , storage - > frame . current_rt - > width , storage - > frame . current_rt - > height , GL_COLOR_BUFFER_BIT , GL_NEAREST ) ;
glBindFramebuffer ( GL_READ_FRAMEBUFFER , 0 ) ;
glBindFramebuffer ( GL_DRAW_FRAMEBUFFER , 0 ) ;
glBindFramebuffer ( GL_READ_FRAMEBUFFER , 0 ) ;
glBindFramebuffer ( GL_DRAW_FRAMEBUFFER , 0 ) ;
}
if ( ! env | | storage - > frame . current_rt - > flags [ RasterizerStorage : : RENDER_TARGET_TRANSPARENT ] ) {
//no environment or transparent render, simply return and convert to SRGB
@ -3431,7 +3451,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
storage - > shaders . copy . set_conditional ( CopyShaderGLES3 : : DISABLE_ALPHA , ! storage - > frame . current_rt - > flags [ RasterizerStorage : : RENDER_TARGET_TRANSPARENT ] ) ;
storage - > shaders . copy . bind ( ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
storage - > shaders . copy . set_conditional ( CopyShaderGLES3 : : LINEAR_TO_SRGB , false ) ;
storage - > shaders . copy . set_conditional ( CopyShaderGLES3 : : DISABLE_ALPHA , false ) ; //compute luminance
@ -3487,7 +3507,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > fbo ) ; //copy to front first
_copy_screen ( ) ;
_copy_screen ( true ) ;
glActiveTexture ( GL_TEXTURE0 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > color ) ;
@ -3574,7 +3594,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > buffers . diffuse ) ;
}
_copy_screen ( ) ;
_copy_screen ( true ) ;
if ( composite_from ! = storage - > frame . current_rt - > buffers . diffuse ) {
@ -3614,7 +3634,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
glBindFramebuffer ( GL_FRAMEBUFFER , exposure_shrink [ 0 ] . fbo ) ;
glViewport ( 0 , 0 , exposure_shrink_size , exposure_shrink_size ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
//second step, shrink to 2x2 pixels
state . exposure_shader . set_conditional ( ExposureShaderGLES3 : : EXPOSURE_BEGIN , false ) ;
@ -3658,7 +3678,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
state . exposure_shader . set_uniform ( ExposureShaderGLES3 : : MAX_LUMINANCE , env - > auto_exposure_max ) ;
state . exposure_shader . set_uniform ( ExposureShaderGLES3 : : MIN_LUMINANCE , env - > auto_exposure_min ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . exposure_shader . set_conditional ( ExposureShaderGLES3 : : EXPOSURE_FORCE_SET , false ) ;
state . exposure_shader . set_conditional ( ExposureShaderGLES3 : : EXPOSURE_END , false ) ;
@ -3729,7 +3749,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . color ) ; //previous level, since mipmaps[0] starts one level bigger
}
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 1 ] . sizes [ i ] . fbo ) ;
_copy_screen ( ) ;
_copy_screen ( true ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : GLOW_GAUSSIAN_HORIZONTAL , false ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : GLOW_FIRST_PASS , false ) ;
state . effect_blur_shader . set_conditional ( EffectBlurShaderGLES3 : : GLOW_USE_AUTO_EXPOSURE , false ) ;
@ -3837,7 +3857,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
state . tonemap_shader . set_uniform ( TonemapShaderGLES3 : : BCS , Vector3 ( env - > adjustments_brightness , env - > adjustments_contrast , env - > adjustments_saturation ) ) ;
}
_copy_screen ( ) ;
_copy_screen ( true , true ) ;
//turn off everything used
state . tonemap_shader . set_conditional ( TonemapShaderGLES3 : : USE_AUTO_EXPOSURE , false ) ;
@ -3913,7 +3933,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
state . used_contact_shadows = true ;
if ( storage - > frame . current_rt & & state . debug_draw ! = VS : : VIEWPORT_DEBUG_DRAW_OVERDRAW ) { //detect with state.used_contact_shadows too
if ( ! storage - > config . no_depth_prepass & & storage - > frame . current_rt & & state . debug_draw ! = VS : : VIEWPORT_DEBUG_DRAW_OVERDRAW ) { //detect with state.used_contact_shadows too
//pre z pass
glDisable ( GL_BLEND ) ;
@ -3927,7 +3947,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
glColorMask ( 0 , 0 , 0 , 0 ) ;
glClearDepth ( 1.0f ) ;
glClear ( GL_DEPTH_BUFFER_BIT ) ;
glClear ( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ) ;
render_list . clear ( ) ;
_fill_render_list ( p_cull_result , p_cull_count , true ) ;
@ -3953,6 +3973,9 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
fb_cleared = true ;
render_pass + + ;
state . using_contact_shadows = true ;
} else {
state . using_contact_shadows = false ;
}
_setup_lights ( p_light_cull_result , p_light_cull_count , p_cam_transform . affine_inverse ( ) , p_cam_projection , p_shadow_atlas ) ;
@ -4034,8 +4057,13 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
} else {
current_fbo = storage - > frame . current_rt - > buffers . fbo ;
glBindFramebuffer ( GL_FRAMEBUFFER , storage - > frame . current_rt - > buffers . fbo ) ;
if ( storage - > frame . current_rt - > buffers . active ) {
current_fbo = storage - > frame . current_rt - > buffers . fbo ;
} else {
current_fbo = storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ;
}
glBindFramebuffer ( GL_FRAMEBUFFER , current_fbo ) ;
state . scene_shader . set_conditional ( SceneShaderGLES3 : : USE_MULTIPLE_RENDER_TARGETS , false ) ;
Vector < GLenum > draw_buffers ;
@ -4045,8 +4073,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
}
if ( ! fb_cleared ) {
glClearDepth ( 1.0f ) ;
glClear ( GL_DEPTH_BUFFER_BIT ) ;
glClearBufferfi ( GL_DEPTH_STENCIL , 0 , 1.0 , 0 ) ;
}
Color clear_color ( 0 , 0 , 0 , 0 ) ;
@ -4111,7 +4138,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
storage - > shaders . copy . bind ( ) ;
_copy_screen ( ) ;
_copy_screen ( true , true ) ;
//turn off everything used
storage - > shaders . copy . set_conditional ( CopyShaderGLES3 : : SRGB_TO_LINEAR , false ) ;
@ -4178,7 +4205,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
_render_mrts ( env , p_cam_projection ) ;
} else {
//FIXME: check that this is possible to use
if ( storage - > frame . current_rt & & st ate. used_screen_texture ) {
if ( storage - > frame . current_rt & & st orage- > frame . current_rt - > buffers . active & & st ate. used_screen_texture ) {
glBindFramebuffer ( GL_READ_FRAMEBUFFER , storage - > frame . current_rt - > buffers . fbo ) ;
glReadBuffer ( GL_COLOR_ATTACHMENT0 ) ;
glBindFramebuffer ( GL_DRAW_FRAMEBUFFER , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . sizes [ 0 ] . fbo ) ;
@ -4192,7 +4219,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
}
}
if ( storage - > frame . current_rt & & state . used_screen_texture ) {
if ( storage - > frame . current_rt & & state . used_screen_texture & & storage - > frame . current_rt - > buffers . active ) {
glActiveTexture ( GL_TEXTURE0 + storage - > config . max_texture_image_units - 7 ) ;
glBindTexture ( GL_TEXTURE_2D , storage - > frame . current_rt - > effects . mip_maps [ 0 ] . color ) ;
}
@ -4273,6 +4300,8 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
}
//disable all stuff
}
void RasterizerSceneGLES3 : : render_shadow ( RID p_light , RID p_shadow_atlas , int p_pass , InstanceBase * * p_cull_result , int p_cull_count ) {
@ -4297,6 +4326,8 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_
float bias = 0 ;
float normal_bias = 0 ;
state . using_contact_shadows = false ;
CameraMatrix light_projection ;
Transform light_transform ;