GLuint uniform_diff_flow_tex;
GLuint uniform_equation_red_tex, uniform_equation_black_tex;
GLuint uniform_diffusivity_tex;
- GLuint uniform_phase, uniform_zero_diff_flow;
+ GLuint uniform_phase, uniform_num_nonzero_phases;
};
SOR::SOR()
uniform_equation_black_tex = glGetUniformLocation(sor_program, "equation_black_tex");
uniform_diffusivity_tex = glGetUniformLocation(sor_program, "diffusivity_tex");
uniform_phase = glGetUniformLocation(sor_program, "phase");
- uniform_zero_diff_flow = glGetUniformLocation(sor_program, "zero_diff_flow");
+ uniform_num_nonzero_phases = glGetUniformLocation(sor_program, "num_nonzero_phases");
}
void SOR::exec(GLuint diff_flow_tex, GLuint equation_red_tex, GLuint equation_black_tex, GLuint diffusivity_tex, int level_width, int level_height, int num_iterations, bool zero_diff_flow, ScopedTimer *sor_timer)
bind_sampler(sor_program, uniform_equation_red_tex, 2, equation_red_tex, nearest_sampler);
bind_sampler(sor_program, uniform_equation_black_tex, 3, equation_black_tex, nearest_sampler);
- glProgramUniform1i(sor_program, uniform_zero_diff_flow, zero_diff_flow);
+ if (!zero_diff_flow) {
+ glProgramUniform1i(sor_program, uniform_num_nonzero_phases, 2);
+ }
// NOTE: We bind to the texture we are rendering from, but we never write any value
// that we read in the same shader pass (we call discard for red values when we compute
for (int i = 0; i < num_iterations; ++i) {
{
ScopedTimer timer("Red pass", sor_timer);
+ if (zero_diff_flow && i == 0) {
+ glProgramUniform1i(sor_program, uniform_num_nonzero_phases, 0);
+ }
glProgramUniform1i(sor_program, uniform_phase, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glTextureBarrier();
{
ScopedTimer timer("Black pass", sor_timer);
if (zero_diff_flow && i == 0) {
- // Not zero anymore.
- glProgramUniform1i(sor_program, uniform_zero_diff_flow, 0);
+ glProgramUniform1i(sor_program, uniform_num_nonzero_phases, 1);
}
glProgramUniform1i(sor_program, uniform_phase, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ if (zero_diff_flow && i == 0) {
+ glProgramUniform1i(sor_program, uniform_num_nonzero_phases, 2);
+ }
if (i != num_iterations - 1) {
glTextureBarrier();
}
// We need somewhere to store du and dv (the flow increment, relative
// to the non-refined base flow u0 and v0). It's initially garbage,
// but not read until we've written something sane to it.
- GLuint du_dv_tex = pool.get_texture(GL_RG16F, level_width, level_height);
+ GLuint diff_flow_tex = pool.get_texture(GL_RG16F, level_width, level_height);
// And for diffusivity.
GLuint diffusivity_tex = pool.get_texture(GL_R16F, level_width, level_height);
// Calculate the diffusivity term for each pixel.
{
ScopedTimer timer("Compute diffusivity", &varref_timer);
- compute_diffusivity.exec(base_flow_tex, du_dv_tex, diffusivity_tex, level_width, level_height, outer_idx == 0);
+ compute_diffusivity.exec(base_flow_tex, diff_flow_tex, diffusivity_tex, level_width, level_height, outer_idx == 0);
}
// Set up the 2x2 equation system for each pixel.
{
ScopedTimer timer("Set up equations", &varref_timer);
- setup_equations.exec(I_x_y_tex, I_t_tex, du_dv_tex, base_flow_tex, beta_0_tex, diffusivity_tex, equation_red_tex, equation_black_tex, level_width, level_height, outer_idx == 0);
+ setup_equations.exec(I_x_y_tex, I_t_tex, diff_flow_tex, base_flow_tex, beta_0_tex, diffusivity_tex, equation_red_tex, equation_black_tex, level_width, level_height, outer_idx == 0);
}
- // Run a few SOR (or quasi-SOR, since we're not really Jacobi) iterations.
- // Note that these are to/from the same texture.
+ // Run a few SOR iterations. Note that these are to/from the same texture.
{
ScopedTimer timer("SOR", &varref_timer);
- sor.exec(du_dv_tex, equation_red_tex, equation_black_tex, diffusivity_tex, level_width, level_height, 5, outer_idx == 0, &timer);
+ sor.exec(diff_flow_tex, equation_red_tex, equation_black_tex, diffusivity_tex, level_width, level_height, 5, outer_idx == 0, &timer);
}
}
// it is more efficient), but it helps debug the motion search.
if (enable_variational_refinement) {
ScopedTimer timer("Add differential flow", &varref_timer);
- add_base_flow.exec(base_flow_tex, du_dv_tex, level_width, level_height);
+ add_base_flow.exec(base_flow_tex, diff_flow_tex, level_width, level_height);
}
- pool.release_texture(du_dv_tex);
+ pool.release_texture(diff_flow_tex);
if (prev_level_flow_tex != initial_flow_tex) {
pool.release_texture(prev_level_flow_tex);