+const Texture2D &PbrMaterial::get_or_create_fresnel_lookup()
+{
+ Resources &resources = Resources::get_global();
+
+ static const string name = "_pbr_fresnel_lookup.tex2d";
+ Texture2D *fresnel_lookup = resources.find<Texture2D>(name);
+ if(fresnel_lookup)
+ return *fresnel_lookup;
+
+ fresnel_lookup = new Texture2D;
+ fresnel_lookup->storage(RG8, 128, 128, 1);
+ resources.add(name, fresnel_lookup);
+
+ const Program &shprog = resources.get<Program>("_pbr_fresnel_lookup.glsl.shader");
+ ProgramData shdata;
+ shdata.uniform("n_samples", 1024);
+ // Not actually used here, but put it in to satisfy the interface
+ shdata.uniform("roughness", 0.0f);
+
+ const Mesh &mesh = resources.get<Mesh>("_fullscreen_quad.mesh");
+ Framebuffer fresnel_lookup_fbo;
+ fresnel_lookup_fbo.attach(COLOR_ATTACHMENT0, *fresnel_lookup);
+ Bind bind_fbo(fresnel_lookup_fbo);
+ Renderer renderer;
+ renderer.set_shader_program(&shprog, &shdata);
+ mesh.draw(renderer);
+
+ return *fresnel_lookup;
+}
+