1use crate::{
24 core::{algebra::Matrix4, array_as_u8_slice},
25 graphics::{
26 buffer::GpuBufferDescriptor,
27 buffer::{BufferKind, BufferUsage, GpuBuffer},
28 error::FrameworkError,
29 geometry_buffer::GpuGeometryBuffer,
30 gpu_program::SamplerFallback,
31 gpu_texture::{GpuTexture, GpuTextureDescriptor, GpuTextureKind, PixelKind},
32 sampler::{
33 GpuSampler, GpuSamplerDescriptor, MagnificationFilter, MinificationFilter, WrapMode,
34 },
35 server::GraphicsServer,
36 },
37 renderer::{cache::shader::RenderPassContainer, framework::GeometryBufferExt},
38 scene::mesh::surface::SurfaceData,
39};
40use fyrox_material::shader::ShaderDefinition;
41
42pub struct ShadersContainer {
44 pub decal: RenderPassContainer,
46 pub spot_light: RenderPassContainer,
48 pub point_light: RenderPassContainer,
50 pub directional_light: RenderPassContainer,
52 pub ambient_light: RenderPassContainer,
54 pub volume_marker_lit: RenderPassContainer,
56 pub pixel_counter: RenderPassContainer,
58 pub debug: RenderPassContainer,
60 pub fxaa: RenderPassContainer,
62 pub spot_light_volume: RenderPassContainer,
64 pub point_light_volume: RenderPassContainer,
66 pub volume_marker_vol: RenderPassContainer,
69 pub visibility_optimizer: RenderPassContainer,
71 pub ssao: RenderPassContainer,
73 pub visibility: RenderPassContainer,
75 pub blit: RenderPassContainer,
77 pub hdr_adaptation: RenderPassContainer,
79 pub hdr_luminance: RenderPassContainer,
81 pub hdr_downscale: RenderPassContainer,
83 pub hdr_map: RenderPassContainer,
85 pub bloom: RenderPassContainer,
87 pub skybox: RenderPassContainer,
89 pub gaussian_blur: RenderPassContainer,
91 pub box_blur: RenderPassContainer,
93 pub ui: RenderPassContainer,
95 pub environment_map_specular_convolution: RenderPassContainer,
97 pub environment_map_irradiance_convolution: RenderPassContainer,
99}
100
101impl ShadersContainer {
102 pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
104 Ok(Self {
105 decal: RenderPassContainer::from_str(server, include_str!("shaders/decal.shader"))?,
106 spot_light: RenderPassContainer::from_str(
107 server,
108 include_str!("shaders/deferred_spot_light.shader"),
109 )?,
110 point_light: RenderPassContainer::from_str(
111 server,
112 include_str!("shaders/deferred_point_light.shader"),
113 )?,
114 directional_light: RenderPassContainer::from_str(
115 server,
116 include_str!("shaders/deferred_directional_light.shader"),
117 )?,
118 ambient_light: RenderPassContainer::from_str(
119 server,
120 include_str!("shaders/ambient_light.shader"),
121 )?,
122 volume_marker_lit: RenderPassContainer::from_str(
123 server,
124 include_str!("shaders/volume_marker_lit.shader"),
125 )?,
126 pixel_counter: RenderPassContainer::from_str(
127 server,
128 include_str!("shaders/pixel_counter.shader"),
129 )?,
130 debug: RenderPassContainer::from_str(server, include_str!("shaders/debug.shader"))?,
131 fxaa: RenderPassContainer::from_str(server, include_str!("shaders/fxaa.shader"))?,
132 spot_light_volume: RenderPassContainer::from_str(
133 server,
134 include_str!("shaders/spot_volumetric.shader"),
135 )?,
136 point_light_volume: RenderPassContainer::from_str(
137 server,
138 include_str!("shaders/point_volumetric.shader"),
139 )?,
140 volume_marker_vol: RenderPassContainer::from_str(
141 server,
142 include_str!("shaders/volume_marker_vol.shader"),
143 )?,
144 visibility_optimizer: RenderPassContainer::from_str(
145 server,
146 include_str!("shaders/visibility_optimizer.shader"),
147 )?,
148 ssao: RenderPassContainer::from_str(server, include_str!("shaders/ssao.shader"))?,
149 visibility: RenderPassContainer::from_str(
150 server,
151 include_str!("shaders/visibility.shader"),
152 )?,
153 blit: RenderPassContainer::from_str(server, include_str!("shaders/blit.shader"))?,
154 hdr_adaptation: RenderPassContainer::from_str(
155 server,
156 include_str!("shaders/hdr_adaptation.shader"),
157 )?,
158 hdr_luminance: RenderPassContainer::from_str(
159 server,
160 include_str!("shaders/hdr_luminance.shader"),
161 )?,
162 hdr_downscale: RenderPassContainer::from_str(
163 server,
164 include_str!("shaders/hdr_downscale.shader"),
165 )?,
166 hdr_map: RenderPassContainer::from_str(server, include_str!("shaders/hdr_map.shader"))?,
167 bloom: RenderPassContainer::from_str(server, include_str!("shaders/bloom.shader"))?,
168 skybox: RenderPassContainer::from_str(server, include_str!("shaders/skybox.shader"))?,
169 gaussian_blur: RenderPassContainer::from_str(
170 server,
171 include_str!("shaders/gaussian_blur.shader"),
172 )?,
173 box_blur: RenderPassContainer::from_str(server, include_str!("shaders/blur.shader"))?,
174 ui: RenderPassContainer::from_str(
175 server,
176 str::from_utf8(
177 fyrox_material::shader::STANDARD_WIDGET
178 .data_source
179 .as_ref()
180 .unwrap()
181 .bytes
182 .as_ref(),
183 )
184 .unwrap(),
185 )?,
186 environment_map_specular_convolution: RenderPassContainer::from_str(
187 server,
188 include_str!("shaders/prefilter.shader"),
189 )?,
190 environment_map_irradiance_convolution: RenderPassContainer::from_str(
191 server,
192 include_str!("shaders/irradiance.shader"),
193 )?,
194 })
195 }
196}
197
198pub struct RendererResources {
201 pub white_dummy: GpuTexture,
204 pub black_dummy: GpuTexture,
206 pub environment_dummy: GpuTexture,
208 pub normal_dummy: GpuTexture,
211 pub metallic_dummy: GpuTexture,
214 pub volume_dummy: GpuTexture,
216 pub bone_matrices_stub_uniform_buffer: GpuBuffer,
218 pub linear_clamp_sampler: GpuSampler,
220 pub linear_mipmap_linear_clamp_sampler: GpuSampler,
222 pub linear_wrap_sampler: GpuSampler,
224 pub nearest_clamp_sampler: GpuSampler,
226 pub nearest_wrap_sampler: GpuSampler,
228 pub quad: GpuGeometryBuffer,
230 pub cube: GpuGeometryBuffer,
232 pub shaders: ShadersContainer,
234}
235
236impl RendererResources {
237 pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
239 Ok(Self {
240 white_dummy: server.create_texture(GpuTextureDescriptor {
241 name: "WhiteDummy",
242 kind: GpuTextureKind::Rectangle {
243 width: 1,
244 height: 1,
245 },
246 pixel_kind: PixelKind::RGBA8,
247 data: Some(&[255u8, 255u8, 255u8, 255u8]),
248 ..Default::default()
249 })?,
250 black_dummy: server.create_texture(GpuTextureDescriptor {
251 name: "BlackDummy",
252 kind: GpuTextureKind::Rectangle {
253 width: 1,
254 height: 1,
255 },
256 pixel_kind: PixelKind::RGBA8,
257 data: Some(&[0u8, 0u8, 0u8, 255u8]),
258 ..Default::default()
259 })?,
260 environment_dummy: server.create_texture(GpuTextureDescriptor {
261 name: "EnvironmentDummy",
262 kind: GpuTextureKind::Cube { size: 1 },
263 pixel_kind: PixelKind::RGBA8,
264 data: Some(&[
265 0u8, 0u8, 0u8, 255u8, 0u8, 0u8, 0u8, 255u8, 0u8, 0u8, 0u8, 255u8, 0u8, 0u8, 0u8, 255u8, 0u8, 0u8, 0u8, 255u8, 0u8, 0u8, 0u8, 255u8, ]),
272 ..Default::default()
273 })?,
274 normal_dummy: server.create_texture(GpuTextureDescriptor {
275 name: "NormalDummy",
276 kind: GpuTextureKind::Rectangle {
277 width: 1,
278 height: 1,
279 },
280 pixel_kind: PixelKind::RGBA8,
281 data: Some(&[128u8, 128u8, 255u8, 255u8]),
282 ..Default::default()
283 })?,
284 metallic_dummy: server.create_texture(GpuTextureDescriptor {
285 name: "MetallicDummy",
286 kind: GpuTextureKind::Rectangle {
287 width: 1,
288 height: 1,
289 },
290 pixel_kind: PixelKind::RGBA8,
291 data: Some(&[0u8, 0u8, 0u8, 0u8]),
292 ..Default::default()
293 })?,
294 volume_dummy: server.create_texture(GpuTextureDescriptor {
295 name: "VolumeDummy",
296 kind: GpuTextureKind::Volume {
297 width: 1,
298 height: 1,
299 depth: 1,
300 },
301 pixel_kind: PixelKind::RGBA8,
302 data: Some(&[0u8, 0u8, 0u8, 0u8]),
303 ..Default::default()
304 })?,
305 bone_matrices_stub_uniform_buffer: {
306 let buffer = server.create_buffer(GpuBufferDescriptor {
307 name: "BoneMatricesStubBuffer",
308 size: ShaderDefinition::MAX_BONE_MATRICES * size_of::<Matrix4<f32>>(),
309 kind: BufferKind::Uniform,
310 usage: BufferUsage::StaticDraw,
311 })?;
312 const SIZE: usize = ShaderDefinition::MAX_BONE_MATRICES * size_of::<Matrix4<f32>>();
313 let zeros = [0.0; SIZE];
314 buffer.write_data(array_as_u8_slice(&zeros))?;
315 buffer
316 },
317 linear_clamp_sampler: server.create_sampler(GpuSamplerDescriptor {
318 min_filter: MinificationFilter::Linear,
319 mag_filter: MagnificationFilter::Linear,
320 s_wrap_mode: WrapMode::ClampToEdge,
321 t_wrap_mode: WrapMode::ClampToEdge,
322 r_wrap_mode: WrapMode::ClampToEdge,
323 ..Default::default()
324 })?,
325 linear_mipmap_linear_clamp_sampler: server.create_sampler(GpuSamplerDescriptor {
326 min_filter: MinificationFilter::LinearMipMapLinear,
327 mag_filter: MagnificationFilter::Linear,
328 s_wrap_mode: WrapMode::ClampToEdge,
329 t_wrap_mode: WrapMode::ClampToEdge,
330 r_wrap_mode: WrapMode::ClampToEdge,
331 ..Default::default()
332 })?,
333 linear_wrap_sampler: server.create_sampler(GpuSamplerDescriptor {
334 min_filter: MinificationFilter::Linear,
335 mag_filter: MagnificationFilter::Linear,
336 ..Default::default()
337 })?,
338 nearest_clamp_sampler: server.create_sampler(GpuSamplerDescriptor {
339 min_filter: MinificationFilter::Nearest,
340 mag_filter: MagnificationFilter::Nearest,
341 s_wrap_mode: WrapMode::ClampToEdge,
342 t_wrap_mode: WrapMode::ClampToEdge,
343 r_wrap_mode: WrapMode::ClampToEdge,
344 ..Default::default()
345 })?,
346 nearest_wrap_sampler: server.create_sampler(GpuSamplerDescriptor {
347 min_filter: MinificationFilter::Nearest,
348 mag_filter: MagnificationFilter::Nearest,
349 ..Default::default()
350 })?,
351 quad: GpuGeometryBuffer::from_surface_data(
352 "UnitQuad",
353 &SurfaceData::make_unit_xy_quad(),
354 BufferUsage::StaticDraw,
355 server,
356 )?,
357 cube: GpuGeometryBuffer::from_surface_data(
358 "UnitCube",
359 &SurfaceData::make_cube(Matrix4::identity()),
360 BufferUsage::StaticDraw,
361 server,
362 )?,
363 shaders: ShadersContainer::new(server)?,
364 })
365 }
366
367 pub fn sampler_fallback(&self, sampler_fallback: SamplerFallback) -> &GpuTexture {
369 match sampler_fallback {
370 SamplerFallback::White => &self.white_dummy,
371 SamplerFallback::Normal => &self.normal_dummy,
372 SamplerFallback::Black => &self.black_dummy,
373 SamplerFallback::Volume => &self.volume_dummy,
374 }
375 }
376}