summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-12-31 10:53:29 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-12-31 10:53:29 -0300
commita62c99c4e4325ca0c015d731f2bcb9b07410bb65 (patch)
treef9579eb97799c881fe5ed6ab4c193f65daaa0ca5 /drivers
parentf4a56e7782526e5e20a4351c4c293a7b4f020acd (diff)
Some fixes and clean ups
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.cpp53
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp19
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h4
-rw-r--r--drivers/gles3/shaders/scene.glsl28
4 files changed, 83 insertions, 21 deletions
diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp
index 7fdd08a834..1b080a1216 100644
--- a/drivers/gles3/rasterizer_scene_gles3.cpp
+++ b/drivers/gles3/rasterizer_scene_gles3.cpp
@@ -3687,9 +3687,47 @@ void RasterizerSceneGLES3::render_scene(const Transform& p_cam_transform,const C
state.ubo_data.subsurface_scatter_width=subsurface_scatter_size;
+ state.ubo_data.shadow_z_offset=0;
+ state.ubo_data.shadow_slope_scale=0;
+ state.ubo_data.shadow_dual_paraboloid_render_side=0;
+ state.ubo_data.shadow_dual_paraboloid_render_zfar=0;
_setup_environment(env,p_cam_projection,p_cam_transform);
+ bool fb_cleared=false;
+
+ glDepthFunc(GL_LEQUAL);
+
+
+ if (storage->frame.current_rt && true) {
+ //pre z pass
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ glEnable(GL_DEPTH_TEST);
+ glDisable(GL_SCISSOR_TEST);
+ glBindFramebuffer(GL_FRAMEBUFFER,storage->frame.current_rt->fbo);
+ glViewport(0,0,storage->frame.current_rt->width,storage->frame.current_rt->height);
+
+ glColorMask(0,0,0,0);
+
+ glClearDepth(1.0);
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+
+ render_list.clear();
+ _fill_render_list(p_cull_result,p_cull_count,true);
+ render_list.sort_by_depth(false);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH,true);
+ _render_list(render_list.elements,render_list.element_count,p_cam_transform,p_cam_projection,0,false,false,true,false,false);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH,false);
+
+ glColorMask(1,1,1,1);
+
+ fb_cleared=true;
+ render_pass++;
+ }
+
+
_setup_lights(p_light_cull_result,p_light_cull_count,p_cam_transform.affine_inverse(),p_cam_projection,p_shadow_atlas);
_setup_reflections(p_reflection_probe_cull_result,p_reflection_probe_cull_count,p_cam_transform.affine_inverse(),p_cam_projection,p_reflection_atlas,env);
@@ -3778,9 +3816,10 @@ void RasterizerSceneGLES3::render_scene(const Transform& p_cam_transform,const C
}
}
-
- glClearDepth(1.0);
- glClear(GL_DEPTH_BUFFER_BIT);
+ if (!fb_cleared) {
+ glClearDepth(1.0);
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
Color clear_color(0,0,0,0);
@@ -4287,7 +4326,7 @@ void RasterizerSceneGLES3::render_shadow(RID p_light,RID p_shadow_atlas,int p_pa
zfar=light->param[VS::LIGHT_PARAM_RANGE];
bias=light->param[VS::LIGHT_PARAM_SHADOW_BIAS];
- state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_SHADOW_DUAL_PARABOLOID,true);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH_DUAL_PARABOLOID,true);
}
} else if (light->type==VS::LIGHT_SPOT) {
@@ -4341,12 +4380,12 @@ void RasterizerSceneGLES3::render_shadow(RID p_light,RID p_shadow_atlas,int p_pa
_setup_environment(NULL,light_projection,light_transform);
- state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_SHADOW,true);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH,true);
_render_list(render_list.elements,render_list.element_count,light_transform,light_projection,0,!flip_facing,false,true,false,false);
- state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_SHADOW,false);
- state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_SHADOW_DUAL_PARABOLOID,false);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH,false);
+ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH_DUAL_PARABOLOID,false);
if (light->type==VS::LIGHT_OMNI && light->omni_shadow_mode==VS::LIGHT_OMNI_SHADOW_CUBE && p_pass==5) {
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index 3fc0513542..2875c1f788 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -4743,6 +4743,7 @@ RID RasterizerStorageGLES3::gi_probe_create() {
gip->dynamic_range=1.0;
gip->energy=1.0;
gip->interior=false;
+ gip->compress=false;
gip->version=1;
gip->cell_size=1.0;
@@ -4864,6 +4865,24 @@ bool RasterizerStorageGLES3::gi_probe_is_interior(RID p_probe) const{
}
+
+void RasterizerStorageGLES3::gi_probe_set_compress(RID p_probe,bool p_enable) {
+
+ GIProbe *gip = gi_probe_owner.getornull(p_probe);
+ ERR_FAIL_COND(!gip);
+
+ gip->compress=p_enable;
+
+}
+
+bool RasterizerStorageGLES3::gi_probe_is_compressed(RID p_probe) const{
+
+ const GIProbe *gip = gi_probe_owner.getornull(p_probe);
+ ERR_FAIL_COND_V(!gip,false);
+
+ return gip->compress;
+
+}
float RasterizerStorageGLES3::gi_probe_get_energy(RID p_probe) const{
const GIProbe *gip = gi_probe_owner.getornull(p_probe);
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index b0f9800159..690a169ca2 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -899,6 +899,7 @@ public:
int dynamic_range;
float energy;
bool interior;
+ bool compress;
uint32_t version;
@@ -932,6 +933,9 @@ public:
virtual void gi_probe_set_interior(RID p_probe,bool p_enable);
virtual bool gi_probe_is_interior(RID p_probe) const;
+ virtual void gi_probe_set_compress(RID p_probe,bool p_enable);
+ virtual bool gi_probe_is_compressed(RID p_probe) const;
+
virtual uint32_t gi_probe_get_version(RID p_probe);
struct GIProbeData : public RID_Data {
diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl
index 90c501ea32..c18a356a54 100644
--- a/drivers/gles3/shaders/scene.glsl
+++ b/drivers/gles3/shaders/scene.glsl
@@ -146,7 +146,7 @@ MATERIAL_UNIFORMS
#endif
-#ifdef RENDER_SHADOW_DUAL_PARABOLOID
+#ifdef RENDER_DEPTH_DUAL_PARABOLOID
out highp float dp_clip;
@@ -253,10 +253,10 @@ VERTEX_SHADER_CODE
binormal_interp = binormal;
#endif
-#ifdef RENDER_SHADOW
+#ifdef RENDER_DEPTH
-#ifdef RENDER_SHADOW_DUAL_PARABOLOID
+#ifdef RENDER_DEPTH_DUAL_PARABOLOID
vertex_interp.z*= shadow_dual_paraboloid_render_side;
normal_interp.z*= shadow_dual_paraboloid_render_side;
@@ -282,12 +282,12 @@ VERTEX_SHADER_CODE
z_ofs += (1.0-abs(normal_interp.z))*shadow_z_slope_scale;
vertex_interp.z-=z_ofs;
-#endif //RENDER_SHADOW_DUAL_PARABOLOID
+#endif //RENDER_DEPTH_DUAL_PARABOLOID
-#endif //RENDER_SHADOW
+#endif //RENDER_DEPTH
-#if !defined(SKIP_TRANSFORM_USED) && !defined(RENDER_SHADOW_DUAL_PARABOLOID)
+#if !defined(SKIP_TRANSFORM_USED) && !defined(RENDER_DEPTH_DUAL_PARABOLOID)
gl_Position = projection_matrix * vec4(vertex_interp,1.0);
#else
gl_Position = vertex;
@@ -622,7 +622,7 @@ float sample_shadow(highp sampler2DShadow shadow, vec2 shadow_pixel_size, vec2 p
}
-#ifdef RENDER_SHADOW_DUAL_PARABOLOID
+#ifdef RENDER_DEPTH_DUAL_PARABOLOID
in highp float dp_clip;
@@ -861,20 +861,20 @@ vec3 voxel_cone_trace(sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, b
float dist = dot(direction,mix(vec3(-1.0),vec3(1.0),greaterThan(direction,vec3(0.0))))*2.0;
float alpha=0.0;
- vec4 color = vec4(0.0);
+ vec3 color = vec3(0.0);
while(dist < max_distance && alpha < 0.95) {
float diameter = max(1.0, 2.0 * tan_half_angle * dist);
vec4 scolor = textureLod(probe, (pos + dist * direction) * cell_size, log2(diameter) );
float a = (1.0 - alpha);
- color.rgb += a * scolor.rgb;
+ color += scolor.rgb * a;
alpha += a * scolor.a;
dist += diameter * 0.5;
}
//color.rgb = mix(color.rgb,mix(ambient,color.rgb,alpha),blend_ambient);
- return color.rgb;
+ return color;
}
void gi_probe_compute(sampler3D probe, mat4 probe_xform, vec3 bounds,vec3 cell_size,vec3 pos, vec3 ambient, vec3 environment, bool blend_ambient,float multiplier, mat3 normal_mtx,vec3 ref_vec, float roughness, out vec4 out_spec, out vec4 out_diff) {
@@ -1004,7 +1004,7 @@ void gi_probes_compute(vec3 pos, vec3 normal, float roughness, vec3 specular, in
void main() {
-#ifdef RENDER_SHADOW_DUAL_PARABOLOID
+#ifdef RENDER_DEPTH_DUAL_PARABOLOID
if (dp_clip>0.0)
discard;
@@ -1128,7 +1128,7 @@ FRAGMENT_SHADER_CODE
vec3 eye_vec = -normalize( vertex_interp );
-#ifndef RENDER_SHADOW
+#ifndef RENDER_DEPTH
float ndotv = clamp(dot(normal,eye_vec),0.0,1.0);
vec2 brdf = texture(brdf_texture, vec2(roughness, ndotv)).xy;
@@ -1370,7 +1370,7 @@ LIGHT_SHADER_CODE
}
#endif
-#ifdef RENDER_SHADOW
+#ifdef RENDER_DEPTH
//nothing happens, so a tree-ssa optimizer will result in no fragment shader :)
#else
@@ -1424,7 +1424,7 @@ LIGHT_SHADER_CODE
-#endif //RENDER_SHADOW
+#endif //RENDER_DEPTH
}