Commit 4115e6d1 by Juan Linietsky

This fixes a bug in refprobe blending, but I have no idea when I fixed it. It…

This fixes a bug in refprobe blending, but I have no idea when I fixed it. It just started working all of sudden..
parent c6f09fb9
...@@ -944,6 +944,8 @@ void RasterizerSceneGLES2::_add_geometry_with_material(RasterizerStorageGLES2::G ...@@ -944,6 +944,8 @@ void RasterizerSceneGLES2::_add_geometry_with_material(RasterizerStorageGLES2::G
int rpsize = e->instance->reflection_probe_instances.size(); int rpsize = e->instance->reflection_probe_instances.size();
if (rpsize > 0) { if (rpsize > 0) {
bool first = true; bool first = true;
rpsize = MIN(rpsize, 2); //more than 2 per object are not supported, this keeps it stable
for (int i = 0; i < rpsize; i++) { for (int i = 0; i < rpsize; i++) {
ReflectionProbeInstance *rpi = reflection_probe_instance_owner.getornull(e->instance->reflection_probe_instances[i]); ReflectionProbeInstance *rpi = reflection_probe_instance_owner.getornull(e->instance->reflection_probe_instances[i]);
if (rpi->last_pass != render_pass) { if (rpi->last_pass != render_pass) {
...@@ -958,11 +960,11 @@ void RasterizerSceneGLES2::_add_geometry_with_material(RasterizerStorageGLES2::G ...@@ -958,11 +960,11 @@ void RasterizerSceneGLES2::_add_geometry_with_material(RasterizerStorageGLES2::G
} }
} }
if (e->refprobe_0_index > e->refprobe_1_index) { //if both are valid, swap them to keep order as best as possible /* if (e->refprobe_0_index > e->refprobe_1_index) { //if both are valid, swap them to keep order as best as possible
uint16_t tmp = e->refprobe_0_index; uint64_t tmp = e->refprobe_0_index;
e->refprobe_0_index = e->refprobe_1_index; e->refprobe_0_index = e->refprobe_1_index;
e->refprobe_1_index = tmp; e->refprobe_1_index = tmp;
} }*/
} }
//add directional lights //add directional lights
...@@ -1231,7 +1233,7 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste ...@@ -1231,7 +1233,7 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste
} }
} }
//bool clear_skeleton_buffer = !storage->config.float_texture_supported; bool clear_skeleton_buffer = !storage->config.float_texture_supported;
if (p_skeleton) { if (p_skeleton) {
...@@ -1351,10 +1353,17 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste ...@@ -1351,10 +1353,17 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste
glVertexAttribPointer(INSTANCE_BONE_BASE + 1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 12, (const void *)(sizeof(float) * 4 * 1)); glVertexAttribPointer(INSTANCE_BONE_BASE + 1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 12, (const void *)(sizeof(float) * 4 * 1));
glVertexAttribPointer(INSTANCE_BONE_BASE + 2, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 12, (const void *)(sizeof(float) * 4 * 2)); glVertexAttribPointer(INSTANCE_BONE_BASE + 2, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 12, (const void *)(sizeof(float) * 4 * 2));
//clear_skeleton_buffer = false; clear_skeleton_buffer = false;
} }
} }
if (clear_skeleton_buffer) {
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 0);
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 1);
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 2);
}
} break; } break;
case VS::INSTANCE_MULTIMESH: { case VS::INSTANCE_MULTIMESH: {
...@@ -1391,6 +1400,9 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste ...@@ -1391,6 +1400,9 @@ void RasterizerSceneGLES2::_setup_geometry(RenderList::Element *p_element, Raste
glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 2); glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 2);
glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 3); glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 3);
glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 4); glDisableVertexAttribArray(INSTANCE_ATTRIB_BASE + 4);
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 0);
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 1);
glDisableVertexAttribArray(INSTANCE_BONE_BASE + 2);
} break; } break;
...@@ -2110,9 +2122,11 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, ...@@ -2110,9 +2122,11 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
} }
if (!unshaded && !accum_pass && e->refprobe_0_index != RenderList::MAX_REFLECTION_PROBES) { if (!unshaded && !accum_pass && e->refprobe_0_index != RenderList::MAX_REFLECTION_PROBES) {
ERR_FAIL_INDEX(e->refprobe_0_index, reflection_probe_count);
refprobe_1 = reflection_probe_instances[e->refprobe_0_index]; refprobe_1 = reflection_probe_instances[e->refprobe_0_index];
} }
if (!unshaded && !accum_pass && e->refprobe_1_index != RenderList::MAX_REFLECTION_PROBES) { if (!unshaded && !accum_pass && e->refprobe_1_index != RenderList::MAX_REFLECTION_PROBES) {
ERR_FAIL_INDEX(e->refprobe_1_index, reflection_probe_count);
refprobe_2 = reflection_probe_instances[e->refprobe_1_index]; refprobe_2 = reflection_probe_instances[e->refprobe_1_index];
} }
...@@ -2437,7 +2451,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const ...@@ -2437,7 +2451,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
if (p_reflection_probe_cull_count) { if (p_reflection_probe_cull_count) {
reflection_probe_instances = (ReflectionProbeInstance **)alloca(sizeof(ReflectionProbeInstance *) * p_reflection_probe_cull_count); reflection_probe_instances = (ReflectionProbeInstance **)alloca(sizeof(ReflectionProbeInstance *) * p_reflection_probe_cull_count);
reflection_probe_count = p_reflection_probe_cull_count;
for (int i = 0; i < p_reflection_probe_cull_count; i++) { for (int i = 0; i < p_reflection_probe_cull_count; i++) {
ReflectionProbeInstance *rpi = reflection_probe_instance_owner.getornull(p_reflection_probe_cull_result[i]); ReflectionProbeInstance *rpi = reflection_probe_instance_owner.getornull(p_reflection_probe_cull_result[i]);
ERR_CONTINUE(!rpi); ERR_CONTINUE(!rpi);
...@@ -2448,6 +2462,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const ...@@ -2448,6 +2462,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
} else { } else {
reflection_probe_instances = NULL; reflection_probe_instances = NULL;
reflection_probe_count = 0;
} }
// render list stuff // render list stuff
......
...@@ -325,6 +325,7 @@ public: ...@@ -325,6 +325,7 @@ public:
mutable RID_Owner<ReflectionProbeInstance> reflection_probe_instance_owner; mutable RID_Owner<ReflectionProbeInstance> reflection_probe_instance_owner;
ReflectionProbeInstance **reflection_probe_instances; ReflectionProbeInstance **reflection_probe_instances;
int reflection_probe_count;
virtual RID reflection_probe_instance_create(RID p_probe); virtual RID reflection_probe_instance_create(RID p_probe);
virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform &p_transform); virtual void reflection_probe_instance_set_transform(RID p_instance, const Transform &p_transform);
......
...@@ -755,12 +755,12 @@ void reflection_process(samplerCube reflection_map, ...@@ -755,12 +755,12 @@ void reflection_process(samplerCube reflection_map,
#endif #endif
ambient_out.rgb = textureCubeLod(reflection_map, amb_normal, RADIANCE_MAX_LOD).rgb; ambient_out.rgb = textureCubeLod(reflection_map, amb_normal, RADIANCE_MAX_LOD).rgb;
ambient_out.a = blend;
ambient_out.rgb = mix(ref_ambient.rgb, ambient_out.rgb, ref_ambient.a); ambient_out.rgb = mix(ref_ambient.rgb, ambient_out.rgb, ref_ambient.a);
if (exterior) { if (exterior) {
ambient_out.rgb = mix(ambient, ambient_out.rgb, blend); ambient_out.rgb = mix(ambient, ambient_out.rgb, blend);
} }
ambient_out.a = blend;
ambient_out.rgb *= blend; ambient_out.rgb *= blend;
ambient_accum += ambient_out; ambient_accum += ambient_out;
...@@ -1357,12 +1357,14 @@ FRAGMENT_SHADER_CODE ...@@ -1357,12 +1357,14 @@ FRAGMENT_SHADER_CODE
ambient_light *= ambient_energy; ambient_light *= ambient_energy;
#if defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2)
#ifdef USE_REFLECTION_PROBE1
vec4 ambient_accum = vec4(0.0); vec4 ambient_accum = vec4(0.0);
vec4 reflection_accum = vec4(0.0); vec4 reflection_accum = vec4(0.0);
#ifdef USE_REFLECTION_PROBE1
reflection_process(reflection_probe1, reflection_process(reflection_probe1,
#ifdef USE_VERTEX_LIGHTING #ifdef USE_VERTEX_LIGHTING
...@@ -1379,6 +1381,9 @@ FRAGMENT_SHADER_CODE ...@@ -1379,6 +1381,9 @@ FRAGMENT_SHADER_CODE
ambient_light, specular_light, reflection_accum, ambient_accum); ambient_light, specular_light, reflection_accum, ambient_accum);
#endif // USE_REFLECTION_PROBE1
#ifdef USE_REFLECTION_PROBE2 #ifdef USE_REFLECTION_PROBE2
reflection_process(reflection_probe2, reflection_process(reflection_probe2,
...@@ -1407,7 +1412,7 @@ FRAGMENT_SHADER_CODE ...@@ -1407,7 +1412,7 @@ FRAGMENT_SHADER_CODE
} }
#endif #endif
#endif //use reflection probe 1 #endif // defined(USE_REFLECTION_PROBE1) || defined(USE_REFLECTION_PROBE2)
#ifdef USE_LIGHTMAP #ifdef USE_LIGHTMAP
//ambient light will come entirely from lightmap is lightmap is used //ambient light will come entirely from lightmap is lightmap is used
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment