60 const run_params& params,
71 const run_params& rparams);
88 const run_params& rparams);
99 const run_params& rparams)
104 const run_params& rparams,
112 const run_params& rparams)
125 const run_params& params,
130 struct ref_probe_program : uniforms_cache
132 void cache_uniforms()
134 cache_uniform(program.get(), u_data0,
"u_data0", gfx::uniform_type::Vec4);
135 cache_uniform(program.get(), u_data1,
"u_data1", gfx::uniform_type::Vec4);
136 cache_uniform(program.get(), u_capture,
"u_capture", gfx::uniform_type::Vec4);
137 cache_uniform(program.get(), s_tex[0],
"s_tex0", gfx::uniform_type::Sampler);
138 cache_uniform(program.get(), s_tex[1],
"s_tex1", gfx::uniform_type::Sampler);
139 cache_uniform(program.get(), s_tex[2],
"s_tex2", gfx::uniform_type::Sampler);
140 cache_uniform(program.get(), s_tex[3],
"s_tex3", gfx::uniform_type::Sampler);
141 cache_uniform(program.get(), s_tex[4],
"s_tex4", gfx::uniform_type::Sampler);
142 cache_uniform(program.get(), s_tex_cube,
"s_tex_cube", gfx::uniform_type::Sampler);
149 std::array<gfx::program::uniform_ptr, 5> s_tex;
152 std::unique_ptr<gpu_program> program;
155 struct box_ref_probe_program : ref_probe_program
157 void cache_uniforms()
159 ref_probe_program::cache_uniforms();
161 cache_uniform(program.get(), u_data2,
"u_data2", gfx::uniform_type::Vec4);
162 cache_uniform(program.get(), u_inv_world,
"u_inv_world", gfx::uniform_type::Mat4);
167 } box_ref_probe_program_;
169 struct sphere_ref_probe_program : ref_probe_program
171 } sphere_ref_probe_program_;
173 struct geom_program : uniforms_cache
175 void cache_uniforms()
177 cache_uniform(program.get(), s_tex_color,
"s_tex_color", gfx::uniform_type::Sampler);
178 cache_uniform(program.get(), s_tex_normal,
"s_tex_normal", gfx::uniform_type::Sampler);
179 cache_uniform(program.get(), s_tex_roughness,
"s_tex_roughness", gfx::uniform_type::Sampler);
180 cache_uniform(program.get(), s_tex_metalness,
"s_tex_metalness", gfx::uniform_type::Sampler);
181 cache_uniform(program.get(), s_tex_ao,
"s_tex_ao", gfx::uniform_type::Sampler);
182 cache_uniform(program.get(), s_tex_emissive,
"s_tex_emissive", gfx::uniform_type::Sampler);
184 cache_uniform(program.get(), u_base_color,
"u_base_color", gfx::uniform_type::Vec4);
185 cache_uniform(program.get(), u_subsurface_color,
"u_subsurface_color", gfx::uniform_type::Vec4);
186 cache_uniform(program.get(), u_emissive_color,
"u_emissive_color", gfx::uniform_type::Vec4);
187 cache_uniform(program.get(), u_surface_data,
"u_surface_data", gfx::uniform_type::Vec4);
188 cache_uniform(program.get(), u_tiling,
"u_tiling", gfx::uniform_type::Vec4);
189 cache_uniform(program.get(), u_dither_threshold,
"u_dither_threshold", gfx::uniform_type::Vec4);
190 cache_uniform(program.get(), u_surface_data2,
"u_surface_data2", gfx::uniform_type::Vec4);
192 cache_uniform(program.get(), u_camera_wpos,
"u_camera_wpos", gfx::uniform_type::Vec4);
193 cache_uniform(program.get(), u_camera_clip_planes,
"u_camera_clip_planes", gfx::uniform_type::Vec4);
194 cache_uniform(program.get(), u_lod_params,
"u_lod_params", gfx::uniform_type::Vec4);
216 std::unique_ptr<gpu_program> program;
219 geom_program geom_program_;
220 geom_program geom_program_skinned_;
221 geom_program geom_program_instanced_;
223 struct color_lighting : uniforms_cache
225 void cache_uniforms()
227 cache_uniform(program.get(), u_light_position,
"u_light_position", gfx::uniform_type::Vec4);
228 cache_uniform(program.get(), u_light_direction,
"u_light_direction", gfx::uniform_type::Vec4);
229 cache_uniform(program.get(), u_light_data,
"u_light_data", gfx::uniform_type::Vec4);
230 cache_uniform(program.get(), u_contact_shadow,
"u_contact_shadow", gfx::uniform_type::Vec4);
231 cache_uniform(program.get(), u_light_color_intensity,
"u_light_color_intensity", gfx::uniform_type::Vec4);
232 cache_uniform(program.get(), u_camera_position,
"u_camera_position", gfx::uniform_type::Vec4);
234 cache_uniform(program.get(), s_tex[0],
"s_tex0", gfx::uniform_type::Sampler);
235 cache_uniform(program.get(), s_tex[1],
"s_tex1", gfx::uniform_type::Sampler);
236 cache_uniform(program.get(), s_tex[2],
"s_tex2", gfx::uniform_type::Sampler);
237 cache_uniform(program.get(), s_tex[3],
"s_tex3", gfx::uniform_type::Sampler);
238 cache_uniform(program.get(), s_tex[4],
"s_tex4", gfx::uniform_type::Sampler);
239 cache_uniform(program.get(), s_tex[5],
"s_tex5", gfx::uniform_type::Sampler);
240 cache_uniform(program.get(), s_tex[6],
"s_tex6", gfx::uniform_type::Sampler);
248 std::array<gfx::program::uniform_ptr, 7> s_tex;
250 std::shared_ptr<gpu_program> program;
253 struct irradiance_compute_program : uniforms_cache
255 void cache_uniforms()
257 cache_uniform(program.get(), u_mode,
"u_mode", gfx::uniform_type::Vec4);
258 cache_uniform(program.get(), u_irradiance_tint_intensity,
"u_irradiance_tint_intensity", gfx::uniform_type::Vec4);
259 cache_uniform(program.get(), u_sun_direction,
"u_sun_direction", gfx::uniform_type::Vec4);
260 cache_uniform(program.get(), u_sun_luminance,
"u_sun_luminance", gfx::uniform_type::Vec4);
261 cache_uniform(program.get(), u_sky_luminance_xyz,
"u_sky_luminance_xyz", gfx::uniform_type::Vec4);
262 cache_uniform(program.get(), u_exposition,
"u_exposition", gfx::uniform_type::Vec4);
263 cache_uniform(program.get(), u_perez_coeff,
"u_perez_coeff", gfx::uniform_type::Vec4, 5);
264 cache_uniform(program.get(), s_env,
"s_env", gfx::uniform_type::Sampler);
275 std::unique_ptr<gpu_program> program;
276 } irradiance_compute_program_;
278 struct indirect_lighting_program : uniforms_cache
280 void cache_uniforms()
282 cache_uniform(program.get(), u_light_data,
"u_light_data", gfx::uniform_type::Vec4);
283 cache_uniform(program.get(), u_camera_position,
"u_camera_position", gfx::uniform_type::Vec4);
285 cache_uniform(program.get(), s_tex[0],
"s_tex0", gfx::uniform_type::Sampler);
286 cache_uniform(program.get(), s_tex[1],
"s_tex1", gfx::uniform_type::Sampler);
287 cache_uniform(program.get(), s_tex[2],
"s_tex2", gfx::uniform_type::Sampler);
288 cache_uniform(program.get(), s_tex[3],
"s_tex3", gfx::uniform_type::Sampler);
289 cache_uniform(program.get(), s_tex[4],
"s_tex4", gfx::uniform_type::Sampler);
290 cache_uniform(program.get(), s_tex[5],
"s_tex5", gfx::uniform_type::Sampler);
291 cache_uniform(program.get(), s_tex[6],
"s_tex6", gfx::uniform_type::Sampler);
292 cache_uniform(program.get(), s_irradiance,
"s_irradiance", gfx::uniform_type::Sampler);
293 cache_uniform(program.get(), s_ssil,
"s_ssil", gfx::uniform_type::Sampler);
297 std::array<gfx::program::uniform_ptr, 7> s_tex;
301 std::unique_ptr<gpu_program> program;
303 } indirect_lighting_program_;
305 struct debug_visualization_program : uniforms_cache
307 void cache_uniforms()
309 cache_uniform(program.get(), u_params,
"u_params", gfx::uniform_type::Vec4);
310 cache_uniform(program.get(), s_tex[0],
"s_tex0", gfx::uniform_type::Sampler);
311 cache_uniform(program.get(), s_tex[1],
"s_tex1", gfx::uniform_type::Sampler);
312 cache_uniform(program.get(), s_tex[2],
"s_tex2", gfx::uniform_type::Sampler);
313 cache_uniform(program.get(), s_tex[3],
"s_tex3", gfx::uniform_type::Sampler);
314 cache_uniform(program.get(), s_tex[4],
"s_tex4", gfx::uniform_type::Sampler);
315 cache_uniform(program.get(), s_tex[5],
"s_tex5", gfx::uniform_type::Sampler);
316 cache_uniform(program.get(), s_tex[6],
"s_tex6", gfx::uniform_type::Sampler);
317 cache_uniform(program.get(), s_tex[7],
"s_tex7", gfx::uniform_type::Sampler);
321 std::array<gfx::program::uniform_ptr, 8> s_tex;
323 std::unique_ptr<gpu_program> program;
325 } debug_visualization_program_;
327 struct irradiance_pass_result
330 math::vec3 global_color = {1.0f, 1.0f, 1.0f};
331 float global_intensity = 0.0f;
335 auto get_light_program(
const light& l)
const ->
const color_lighting&;
336 auto get_light_program_no_shadows(
const light& l)
const ->
const color_lighting&;
337 void submit_pbr_material(geom_program& program,
const pbr_material& mat);
354 std::shared_ptr<int> sentinel_ = std::make_shared<int>(0);