+ TextureCubeFace face = TextureCube::enumerate_faces(i);
+ faces[i].fbo.attach(COLOR_ATTACHMENT0, env_tex, face, 0);
+ faces[i].fbo.attach(DEPTH_ATTACHMENT, depth_buf);
+ faces[i].fbo.require_complete();
+ faces[i].camera.set_look_direction(TextureCube::get_face_direction(face));
+ faces[i].camera.set_up_direction(TextureCube::get_t_direction(face));
+ faces[i].camera.set_field_of_view(Geometry::Angle<float>::right());
+ faces[i].camera.set_aspect_ratio(1);
+ faces[i].camera.set_depth_clip(0.1, 100);
+ }
+
+ irradiance.storage(f, size/4, 1);
+ irradiance_fbo.attach_layered(COLOR_ATTACHMENT0, irradiance);
+
+ if(l>1)
+ {
+ specular_fbos.resize(l-1);
+ for(unsigned i=1; i<l; ++i)
+ specular_fbos[i-1].attach_layered(COLOR_ATTACHMENT0, env_tex, i);
+
+ LinAl::Matrix<float, 3, 3> face_matrices[6];
+ for(unsigned i=0; i<6; ++i)
+ {
+ GL::TextureCubeFace face = GL::TextureCube::enumerate_faces(i);
+ GL::Vector3 columns[3];
+ columns[0] = GL::TextureCube::get_s_direction(face);
+ columns[1] = GL::TextureCube::get_t_direction(face);
+ columns[2] = GL::TextureCube::get_face_direction(face);
+ face_matrices[i] = LinAl::Matrix<float, 3, 3>::from_columns(columns);
+ }
+
+ prefilter_shdata.uniform_array("faces", 6, &face_matrices[0]);
+ prefilter_shdata.uniform("n_samples", 128);
+ prefilter_shdata.uniform("roughness", 1.0f);