mirror of
https://github.com/FyroxEngine/Fyrox.git
synced 2026-10-12 02:02:20 +00:00
named gpu textures
- makes debugging easier - part of named resources refactoring
This commit is contained in:
@@ -334,11 +334,13 @@ fn render_scene_to_texture(
|
||||
scene.update(rt_size, 0.016, Default::default());
|
||||
|
||||
let temp_handle = Handle::new(u32::MAX, u32::MAX);
|
||||
if let Ok(scene_data) =
|
||||
graphics_context
|
||||
.renderer
|
||||
.render_scene(temp_handle, scene, elapsed_time, 0.0)
|
||||
{
|
||||
if let Ok(scene_data) = graphics_context.renderer.render_scene(
|
||||
temp_handle,
|
||||
scene,
|
||||
elapsed_time,
|
||||
0.0,
|
||||
&engine.resource_manager,
|
||||
) {
|
||||
let ldr_texture = scene_data.scene_data.ldr_scene_frame_texture();
|
||||
|
||||
let (width, height) = match ldr_texture.kind() {
|
||||
@@ -626,6 +628,7 @@ pub fn render_ui_to_texture(
|
||||
ui.draw(),
|
||||
Color::opaque(100, 100, 100),
|
||||
PixelKind::RGBA8,
|
||||
&engine.resource_manager,
|
||||
)
|
||||
.ok()?;
|
||||
|
||||
|
||||
@@ -59,11 +59,11 @@ impl HighlightRenderPass {
|
||||
height = height.max(1);
|
||||
|
||||
let depth_stencil = server
|
||||
.create_2d_render_target(PixelKind::D24S8, width, height)
|
||||
.create_2d_render_target("HighlightDepthStencil", PixelKind::D24S8, width, height)
|
||||
.unwrap();
|
||||
|
||||
let frame_texture = server
|
||||
.create_2d_render_target(PixelKind::RGBA8, width, height)
|
||||
.create_2d_render_target("HighlightFrameTexture", PixelKind::RGBA8, width, height)
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
@@ -159,6 +159,7 @@ impl SceneRenderPass for HighlightRenderPass {
|
||||
scene_depth: Some(ctx.depth_texture),
|
||||
viewport: ctx.observer.viewport,
|
||||
uniform_memory_allocator: ctx.uniform_memory_allocator,
|
||||
resource_manager: ctx.resource_manager,
|
||||
},
|
||||
)?;
|
||||
}
|
||||
|
||||
@@ -100,10 +100,13 @@ impl SceneRenderPass for OverlayRenderPass {
|
||||
let camera_side = inv_view.side();
|
||||
let sound_icon = ctx
|
||||
.texture_cache
|
||||
.get(ctx.server, &self.sound_icon)
|
||||
.get(ctx.server, ctx.resource_manager, &self.sound_icon)
|
||||
.cloned()
|
||||
.unwrap();
|
||||
let light_icon = ctx.texture_cache.get(ctx.server, &self.light_icon).unwrap();
|
||||
let light_icon = ctx
|
||||
.texture_cache
|
||||
.get(ctx.server, ctx.resource_manager, &self.light_icon)
|
||||
.unwrap();
|
||||
|
||||
for node in ctx.scene.graph.linear_iter() {
|
||||
let icon =
|
||||
|
||||
@@ -397,6 +397,7 @@ impl SceneController for UiScene {
|
||||
&self.ui.drawing_context,
|
||||
Color::DIM_GRAY,
|
||||
PixelKind::RGBA8,
|
||||
&engine.resource_manager,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -287,6 +287,11 @@ impl GlTexture {
|
||||
result.set_data(desc.kind, desc.pixel_kind, desc.mip_count, desc.data)?;
|
||||
|
||||
let mut binding = result.make_temp_binding();
|
||||
if server.gl.supports_debug() {
|
||||
server
|
||||
.gl
|
||||
.object_label(glow::TEXTURE, texture.0.get(), Some(desc.name));
|
||||
}
|
||||
binding.set_base_level(desc.base_level);
|
||||
binding.set_max_level(desc.max_level);
|
||||
|
||||
|
||||
@@ -417,6 +417,8 @@ pub enum CubeMapFace {
|
||||
|
||||
/// Descriptor of a texture that is used to request textures from a graphics server.
|
||||
pub struct GpuTextureDescriptor<'a> {
|
||||
/// Name of the texture. This name is used only for debug purposes.
|
||||
pub name: &'a str,
|
||||
/// Kind of the texture. See [`GpuTextureKind`] docs for more info.
|
||||
pub kind: GpuTextureKind,
|
||||
/// Pixel kind of the texture. See [`PixelKind`] docs for more info.
|
||||
@@ -442,6 +444,7 @@ impl Default for GpuTextureDescriptor<'_> {
|
||||
// and may potentially lead to weird behavior!
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
name: "",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 1,
|
||||
height: 1,
|
||||
|
||||
@@ -176,11 +176,13 @@ pub trait GraphicsServer: GraphicsServerAsAny {
|
||||
/// size and pixel kind.
|
||||
fn create_2d_render_target(
|
||||
&self,
|
||||
name: &str,
|
||||
pixel_kind: PixelKind,
|
||||
width: usize,
|
||||
height: usize,
|
||||
) -> Result<GpuTexture, FrameworkError> {
|
||||
self.create_texture(GpuTextureDescriptor {
|
||||
name,
|
||||
kind: GpuTextureKind::Rectangle { width, height },
|
||||
pixel_kind,
|
||||
..Default::default()
|
||||
@@ -191,10 +193,12 @@ pub trait GraphicsServer: GraphicsServerAsAny {
|
||||
/// size and pixel kind.
|
||||
fn create_cube_render_target(
|
||||
&self,
|
||||
name: &str,
|
||||
pixel_kind: PixelKind,
|
||||
size: usize,
|
||||
) -> Result<GpuTexture, FrameworkError> {
|
||||
self.create_texture(GpuTextureDescriptor {
|
||||
name,
|
||||
kind: GpuTextureKind::Cube { size },
|
||||
pixel_kind,
|
||||
..Default::default()
|
||||
|
||||
@@ -1869,7 +1869,7 @@ impl Engine {
|
||||
let window_size = if let GraphicsContext::Initialized(ctx) = &mut self.graphics_context {
|
||||
let inner_size = ctx.window.inner_size();
|
||||
let window_size = Vector2::new(inner_size.width as f32, inner_size.height as f32);
|
||||
ctx.renderer.update_caches(dt);
|
||||
ctx.renderer.update_caches(&self.resource_manager, dt);
|
||||
window_size
|
||||
} else {
|
||||
Vector2::new(1.0, 1.0)
|
||||
@@ -2349,6 +2349,7 @@ impl Engine {
|
||||
self.elapsed_time,
|
||||
self.user_interfaces.iter().map(|ui| &ui.drawing_context),
|
||||
&ctx.window,
|
||||
&self.resource_manager,
|
||||
)?;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ pub struct GaussianBlur {
|
||||
|
||||
fn create_framebuffer(
|
||||
server: &dyn GraphicsServer,
|
||||
name: &str,
|
||||
width: usize,
|
||||
height: usize,
|
||||
pixel_kind: PixelKind,
|
||||
@@ -53,7 +54,7 @@ fn create_framebuffer(
|
||||
server.create_frame_buffer(
|
||||
None,
|
||||
vec![Attachment::color(
|
||||
server.create_2d_render_target(pixel_kind, width, height)?,
|
||||
server.create_2d_render_target(name, pixel_kind, width, height)?,
|
||||
)],
|
||||
)
|
||||
}
|
||||
@@ -66,8 +67,8 @@ impl GaussianBlur {
|
||||
pixel_kind: PixelKind,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
Ok(Self {
|
||||
h_framebuffer: create_framebuffer(server, width, height, pixel_kind)?,
|
||||
v_framebuffer: create_framebuffer(server, width, height, pixel_kind)?,
|
||||
h_framebuffer: create_framebuffer(server, "HBlur", width, height, pixel_kind)?,
|
||||
v_framebuffer: create_framebuffer(server, "VBlur", width, height, pixel_kind)?,
|
||||
width,
|
||||
height,
|
||||
})
|
||||
|
||||
@@ -57,6 +57,7 @@ impl BloomRenderer {
|
||||
framebuffer: server.create_frame_buffer(
|
||||
None,
|
||||
vec![Attachment::color(server.create_2d_render_target(
|
||||
"Bloom",
|
||||
PixelKind::RGBA16F,
|
||||
width,
|
||||
height,
|
||||
|
||||
@@ -78,6 +78,7 @@ use crate::{
|
||||
use fxhash::{FxBuildHasher, FxHashMap, FxHasher};
|
||||
use fyrox_graph::{SceneGraph, SceneGraphNode};
|
||||
use fyrox_graphics::gpu_program::{SamplerFallback, ShaderResourceDefinition};
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
use std::{
|
||||
fmt::{Debug, Formatter},
|
||||
hash::{Hash, Hasher},
|
||||
@@ -131,6 +132,7 @@ pub struct BundleRenderContext<'a> {
|
||||
pub frame_buffer: &'a GpuFrameBuffer,
|
||||
pub viewport: Rect<i32>,
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
|
||||
// Built-in uniforms.
|
||||
pub use_pom: bool,
|
||||
@@ -343,6 +345,7 @@ pub fn make_texture_binding(
|
||||
resource_definition: &ShaderResourceDefinition,
|
||||
renderer_resources: &RendererResources,
|
||||
fallback: SamplerFallback,
|
||||
resource_manager: &ResourceManager,
|
||||
texture_cache: &mut TextureCache,
|
||||
) -> ResourceBinding {
|
||||
let fallback = renderer_resources.sampler_fallback(fallback);
|
||||
@@ -356,7 +359,7 @@ pub fn make_texture_binding(
|
||||
.as_ref()
|
||||
.and_then(|t| {
|
||||
texture_cache
|
||||
.get(server, t)
|
||||
.get(server, resource_manager, t)
|
||||
.map(|t| (&t.gpu_texture, &t.gpu_sampler))
|
||||
})
|
||||
.unwrap_or(fallback)
|
||||
@@ -620,6 +623,7 @@ impl RenderDataBundle {
|
||||
resource_definition,
|
||||
render_context.renderer_resources,
|
||||
fallback,
|
||||
render_context.resource_manager,
|
||||
render_context.texture_cache,
|
||||
));
|
||||
}
|
||||
|
||||
+20
-7
@@ -30,10 +30,13 @@ use fyrox_graphics::gpu_texture::{GpuTexture, GpuTextureDescriptor, GpuTextureKi
|
||||
use fyrox_graphics::sampler::{
|
||||
GpuSampler, GpuSamplerDescriptor, MagnificationFilter, MinificationFilter, WrapMode,
|
||||
};
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
use fyrox_texture::{
|
||||
TextureKind, TextureMagnificationFilter, TextureMinificationFilter, TexturePixelKind,
|
||||
TextureWrapMode,
|
||||
};
|
||||
use std::borrow::Cow;
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct TextureRenderData {
|
||||
@@ -149,9 +152,18 @@ fn create_sampler(
|
||||
|
||||
fn create_gpu_texture(
|
||||
server: &dyn GraphicsServer,
|
||||
resource_manager: &ResourceManager,
|
||||
uuid: &Uuid,
|
||||
texture: &Texture,
|
||||
) -> Result<TextureRenderData, FrameworkError> {
|
||||
let path = resource_manager.uuid_to_resource_path(*uuid);
|
||||
let name = path
|
||||
.as_ref()
|
||||
.map(|path| path.to_string_lossy())
|
||||
.unwrap_or_else(|| Cow::Borrowed(""));
|
||||
|
||||
let gpu_texture = server.create_texture(GpuTextureDescriptor {
|
||||
name: &name,
|
||||
kind: convert_texture_kind(texture.kind()),
|
||||
pixel_kind: convert_pixel_kind(texture.pixel_kind()),
|
||||
mip_count: texture.mip_count() as usize,
|
||||
@@ -174,14 +186,15 @@ impl TextureCache {
|
||||
pub fn upload(
|
||||
&mut self,
|
||||
server: &dyn GraphicsServer,
|
||||
resource_manager: &ResourceManager,
|
||||
texture: &TextureResource,
|
||||
) -> Result<(), FrameworkError> {
|
||||
let mut texture = texture.state();
|
||||
if let Some(texture) = texture.data() {
|
||||
let texture = texture.state();
|
||||
if let Some((texture, uuid)) = texture.data_ref_with_id() {
|
||||
self.cache.get_entry_mut_or_insert_with(
|
||||
&texture.cache_index,
|
||||
Default::default(),
|
||||
|| create_gpu_texture(server, texture),
|
||||
|| create_gpu_texture(server, resource_manager, uuid, texture),
|
||||
)?;
|
||||
Ok(())
|
||||
} else {
|
||||
@@ -194,15 +207,15 @@ impl TextureCache {
|
||||
pub fn get(
|
||||
&mut self,
|
||||
server: &dyn GraphicsServer,
|
||||
resource_manager: &ResourceManager,
|
||||
texture_resource: &TextureResource,
|
||||
) -> Option<&TextureRenderData> {
|
||||
let mut texture_data_guard = texture_resource.state();
|
||||
|
||||
if let Some(texture) = texture_data_guard.data() {
|
||||
let texture_data_guard = texture_resource.state();
|
||||
if let Some((texture, uuid)) = texture_data_guard.data_ref_with_id() {
|
||||
match self.cache.get_mut_or_insert_with(
|
||||
&texture.cache_index,
|
||||
Default::default(),
|
||||
|| create_gpu_texture(server, texture),
|
||||
|| create_gpu_texture(server, resource_manager, uuid, texture),
|
||||
) {
|
||||
Ok(entry) => {
|
||||
// Check if some value has changed in resource.
|
||||
|
||||
@@ -33,6 +33,7 @@ use crate::{
|
||||
};
|
||||
use fyrox_graphics::framebuffer::GpuFrameBuffer;
|
||||
use fyrox_graphics::gpu_texture::GpuTexture;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub(crate) struct ForwardRenderer {
|
||||
render_pass_name: ImmutableString,
|
||||
@@ -51,6 +52,7 @@ pub(crate) struct ForwardRenderContext<'a> {
|
||||
pub scene_depth: &'a GpuTexture,
|
||||
pub ambient_light: Color,
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
impl ForwardRenderer {
|
||||
@@ -79,6 +81,7 @@ impl ForwardRenderer {
|
||||
scene_depth,
|
||||
ambient_light,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
} = args;
|
||||
|
||||
statistics += bundle_storage.render_to_frame_buffer(
|
||||
@@ -93,6 +96,7 @@ impl ForwardRenderer {
|
||||
frame_buffer: framebuffer,
|
||||
viewport,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
use_pom: quality_settings.use_parallax_mapping,
|
||||
light_position: &Default::default(),
|
||||
renderer_resources,
|
||||
|
||||
@@ -52,6 +52,7 @@ use crate::{
|
||||
scene::{decal::Decal, graph::Graph, mesh::RenderPath},
|
||||
};
|
||||
use fxhash::FxHashSet;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub struct GBuffer {
|
||||
framebuffer: GpuFrameBuffer,
|
||||
@@ -77,6 +78,7 @@ pub(crate) struct GBufferRenderContext<'a, 'b> {
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
#[allow(dead_code)]
|
||||
pub screen_space_debug_renderer: &'a mut DebugRenderer,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
impl GBuffer {
|
||||
@@ -85,10 +87,21 @@ impl GBuffer {
|
||||
width: usize,
|
||||
height: usize,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
let diffuse_texture = server.create_2d_render_target(PixelKind::RGBA8, width, height)?;
|
||||
let normal_texture = server.create_2d_render_target(PixelKind::RGBA8, width, height)?;
|
||||
let diffuse_texture = server.create_2d_render_target(
|
||||
"GBufferDiffuseTexture",
|
||||
PixelKind::RGBA8,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
let normal_texture = server.create_2d_render_target(
|
||||
"GBufferNormalTexture",
|
||||
PixelKind::RGBA8,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
let framebuffer = server.create_frame_buffer(
|
||||
Some(Attachment::depth_stencil(server.create_2d_render_target(
|
||||
"GBufferDepthStencilTexture",
|
||||
PixelKind::D24S8,
|
||||
width,
|
||||
height,
|
||||
@@ -97,16 +110,19 @@ impl GBuffer {
|
||||
Attachment::color(diffuse_texture.clone()),
|
||||
Attachment::color(normal_texture.clone()),
|
||||
Attachment::color(server.create_2d_render_target(
|
||||
"GBufferAmbientTexture",
|
||||
PixelKind::RGBA16F,
|
||||
width,
|
||||
height,
|
||||
)?),
|
||||
Attachment::color(server.create_2d_render_target(
|
||||
"GBufferMaterialTexture",
|
||||
PixelKind::RGBA8,
|
||||
width,
|
||||
height,
|
||||
)?),
|
||||
Attachment::color(server.create_2d_render_target(
|
||||
"GBufferDecalMaskTexture",
|
||||
PixelKind::R8UI,
|
||||
width,
|
||||
height,
|
||||
@@ -178,6 +194,7 @@ impl GBuffer {
|
||||
graph,
|
||||
uniform_buffer_cache,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
..
|
||||
} = args;
|
||||
|
||||
@@ -215,6 +232,7 @@ impl GBuffer {
|
||||
frame_buffer: &self.framebuffer,
|
||||
viewport,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
use_pom: quality_settings.use_parallax_mapping,
|
||||
light_position: &Default::default(),
|
||||
renderer_resources,
|
||||
@@ -263,7 +281,7 @@ impl GBuffer {
|
||||
.diffuse_texture()
|
||||
.and_then(|t| {
|
||||
texture_cache
|
||||
.get(server, t)
|
||||
.get(server, resource_manager, t)
|
||||
.map(|t| (t.gpu_texture.clone(), t.gpu_sampler.clone()))
|
||||
})
|
||||
.unwrap_or((
|
||||
@@ -276,7 +294,7 @@ impl GBuffer {
|
||||
.normal_texture()
|
||||
.and_then(|t| {
|
||||
texture_cache
|
||||
.get(server, t)
|
||||
.get(server, resource_manager, t)
|
||||
.map(|t| (t.gpu_texture.clone(), t.gpu_sampler.clone()))
|
||||
})
|
||||
.unwrap_or((
|
||||
|
||||
@@ -44,6 +44,7 @@ use crate::{
|
||||
scene::camera::{ColorGradingLut, Exposure},
|
||||
};
|
||||
use fyrox_graphics::framebuffer::ReadTarget;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
mod adaptation;
|
||||
mod luminance;
|
||||
@@ -61,7 +62,8 @@ pub struct LumBuffer {
|
||||
|
||||
impl LumBuffer {
|
||||
fn new(server: &dyn GraphicsServer, size: usize) -> Result<Self, FrameworkError> {
|
||||
let texture = server.create_2d_render_target(PixelKind::R32F, size, size)?;
|
||||
let texture =
|
||||
server.create_2d_render_target("LuminanceTexture", PixelKind::R32F, size, size)?;
|
||||
Ok(Self {
|
||||
framebuffer: server.create_frame_buffer(None, vec![Attachment::color(texture)])?,
|
||||
size,
|
||||
@@ -108,6 +110,7 @@ impl HighDynamicRangeRenderer {
|
||||
],
|
||||
adaptation_chain: AdaptationChain::new(server)?,
|
||||
stub_lut: server.create_texture(GpuTextureDescriptor {
|
||||
name: "StubHdrLut",
|
||||
kind: GpuTextureKind::Volume {
|
||||
width: 1,
|
||||
height: 1,
|
||||
@@ -292,13 +295,14 @@ impl HighDynamicRangeRenderer {
|
||||
texture_cache: &mut TextureCache,
|
||||
uniform_buffer_cache: &mut UniformBufferCache,
|
||||
renderer_resources: &RendererResources,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<DrawCallStatistics, FrameworkError> {
|
||||
let frame_matrix = make_viewport_matrix(viewport);
|
||||
|
||||
let color_grading_lut_tex = color_grading_lut
|
||||
.and_then(|l| {
|
||||
texture_cache
|
||||
.get(server, l.lut_ref())
|
||||
.get(server, resource_manager, l.lut_ref())
|
||||
.map(|t| (&t.gpu_texture, &t.gpu_sampler))
|
||||
})
|
||||
.unwrap_or((&self.stub_lut, &renderer_resources.nearest_clamp_sampler));
|
||||
@@ -369,6 +373,7 @@ impl HighDynamicRangeRenderer {
|
||||
texture_cache: &mut TextureCache,
|
||||
uniform_buffer_cache: &mut UniformBufferCache,
|
||||
renderer_resources: &RendererResources,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<RenderPassStatistics, FrameworkError> {
|
||||
let mut stats = RenderPassStatistics::default();
|
||||
stats += self.calculate_frame_luminance(
|
||||
@@ -390,6 +395,7 @@ impl HighDynamicRangeRenderer {
|
||||
texture_cache,
|
||||
uniform_buffer_cache,
|
||||
renderer_resources,
|
||||
resource_manager,
|
||||
)?;
|
||||
Ok(stats)
|
||||
}
|
||||
|
||||
@@ -63,6 +63,7 @@ use crate::{
|
||||
},
|
||||
};
|
||||
use fyrox_graphics::gpu_texture::GpuTexture;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub struct DeferredLightRenderer {
|
||||
sphere: GpuGeometryBuffer,
|
||||
@@ -94,6 +95,7 @@ pub(crate) struct DeferredRendererContext<'a> {
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
pub dynamic_surface_cache: &'a mut DynamicSurfaceCache,
|
||||
pub ssao_renderer: &'a ScreenSpaceAmbientOcclusionRenderer,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
impl DeferredLightRenderer {
|
||||
@@ -255,6 +257,7 @@ impl DeferredLightRenderer {
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
ssao_renderer,
|
||||
resource_manager,
|
||||
} = args;
|
||||
|
||||
let viewport = Rect::new(0, 0, gbuffer.width, gbuffer.height);
|
||||
@@ -288,7 +291,7 @@ impl DeferredLightRenderer {
|
||||
|
||||
// Render skybox (if any).
|
||||
if let Some(skybox) = scene.skybox_ref().and_then(|s| s.cubemap_ref()) {
|
||||
if let Some(texture_sampler_pair) = textures.get(server, skybox) {
|
||||
if let Some(texture_sampler_pair) = textures.get(server, resource_manager, skybox) {
|
||||
let size = observer.position.z_far / 2.0f32.sqrt();
|
||||
let scale = Matrix4::new_scaling(size);
|
||||
let wvp = Matrix4::new_translation(&observer.position.translation) * scale;
|
||||
@@ -327,7 +330,11 @@ impl DeferredLightRenderer {
|
||||
.as_ref()
|
||||
.or(render_data_bundle.environment_map.as_ref())
|
||||
.or_else(|| scene.skybox_ref().and_then(|s| s.cubemap_ref()))
|
||||
.and_then(|c| textures.get(server, c).map(|d| &d.gpu_texture))
|
||||
.and_then(|c| {
|
||||
textures
|
||||
.get(server, resource_manager, c)
|
||||
.map(|d| &d.gpu_texture)
|
||||
})
|
||||
.unwrap_or(&renderer_resources.environment_dummy);
|
||||
|
||||
// Ambient light.
|
||||
@@ -640,6 +647,7 @@ impl DeferredLightRenderer {
|
||||
renderer_resources,
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
resource_manager,
|
||||
)?;
|
||||
|
||||
light_stats.spot_shadow_maps_rendered += 1;
|
||||
@@ -661,6 +669,7 @@ impl DeferredLightRenderer {
|
||||
renderer_resources,
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
light_stats.point_shadow_maps_rendered += 1;
|
||||
@@ -679,6 +688,7 @@ impl DeferredLightRenderer {
|
||||
renderer_resources,
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
light_stats.csm_rendered += 1;
|
||||
@@ -699,19 +709,11 @@ impl DeferredLightRenderer {
|
||||
ref cookie_texture,
|
||||
..
|
||||
} => {
|
||||
let (cookie_enabled, cookie_texture) =
|
||||
if let Some(texture) = cookie_texture.as_ref() {
|
||||
if let Some(cookie) = textures.get(server, texture) {
|
||||
(true, (&cookie.gpu_texture, &cookie.gpu_sampler))
|
||||
} else {
|
||||
(
|
||||
false,
|
||||
(
|
||||
&renderer_resources.white_dummy,
|
||||
&renderer_resources.linear_wrap_sampler,
|
||||
),
|
||||
)
|
||||
}
|
||||
let (cookie_enabled, cookie_texture) = if let Some(texture) =
|
||||
cookie_texture.as_ref()
|
||||
{
|
||||
if let Some(cookie) = textures.get(server, resource_manager, texture) {
|
||||
(true, (&cookie.gpu_texture, &cookie.gpu_sampler))
|
||||
} else {
|
||||
(
|
||||
false,
|
||||
@@ -720,7 +722,16 @@ impl DeferredLightRenderer {
|
||||
&renderer_resources.linear_wrap_sampler,
|
||||
),
|
||||
)
|
||||
};
|
||||
}
|
||||
} else {
|
||||
(
|
||||
false,
|
||||
(
|
||||
&renderer_resources.white_dummy,
|
||||
&renderer_resources.linear_wrap_sampler,
|
||||
),
|
||||
)
|
||||
};
|
||||
|
||||
light_stats.spot_lights_rendered += 1;
|
||||
|
||||
|
||||
@@ -234,10 +234,19 @@ impl RenderDataContainer {
|
||||
assert_eq!(width, height);
|
||||
}
|
||||
|
||||
let depth_stencil = server.create_2d_render_target(PixelKind::D24S8, width, height)?;
|
||||
let depth_stencil = server.create_2d_render_target(
|
||||
"ObserverDepthStencil",
|
||||
PixelKind::D24S8,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
// Intermediate scene frame will be rendered in HDR render target.
|
||||
let hdr_frame_texture =
|
||||
server.create_2d_render_target(PixelKind::RGBA16F, width, height)?;
|
||||
let hdr_frame_texture = server.create_2d_render_target(
|
||||
"ObserverHdrFrame",
|
||||
PixelKind::RGBA16F,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
|
||||
let hdr_scene_framebuffer = server.create_frame_buffer(
|
||||
Some(Attachment::depth_stencil(depth_stencil.clone())),
|
||||
@@ -245,6 +254,7 @@ impl RenderDataContainer {
|
||||
)?;
|
||||
|
||||
let ldr_frame_texture = server.create_texture(GpuTextureDescriptor {
|
||||
name: "LdrFrameTexture",
|
||||
kind: match final_frame_texture {
|
||||
FrameTextureKind::Rectangle => GpuTextureKind::Rectangle { width, height },
|
||||
FrameTextureKind::Cube => GpuTextureKind::Cube { size: width },
|
||||
@@ -266,6 +276,7 @@ impl RenderDataContainer {
|
||||
depth_stencil: GpuTexture,
|
||||
) -> Result<GpuFrameBuffer, FrameworkError> {
|
||||
let ldr_temp_texture = server.create_texture(GpuTextureDescriptor {
|
||||
name: "LdrTempTexture",
|
||||
kind: GpuTextureKind::Rectangle { width, height },
|
||||
// Final scene frame is in standard sRGB space.
|
||||
pixel_kind: PixelKind::RGBA8,
|
||||
@@ -396,6 +407,7 @@ fn make_ui_frame_buffer(
|
||||
pixel_kind: PixelKind,
|
||||
) -> Result<GpuFrameBuffer, FrameworkError> {
|
||||
let color_texture = server.create_texture(GpuTextureDescriptor {
|
||||
name: "UiFbTexture",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: frame_size.x as usize,
|
||||
height: frame_size.y as usize,
|
||||
@@ -405,6 +417,7 @@ fn make_ui_frame_buffer(
|
||||
})?;
|
||||
|
||||
let depth_stencil = server.create_2d_render_target(
|
||||
"UiDepthStencil",
|
||||
PixelKind::D24S8,
|
||||
frame_size.x as usize,
|
||||
frame_size.y as usize,
|
||||
@@ -498,6 +511,9 @@ pub struct SceneRenderPassContext<'a, 'b> {
|
||||
|
||||
/// Dynamic surface cache. See [`DynamicSurfaceCache`] docs for more info.
|
||||
pub dynamic_surface_cache: &'a mut DynamicSurfaceCache,
|
||||
|
||||
/// A reference to the resource manager.
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
/// A trait for custom scene rendering pass. It could be used to add your own rendering techniques.
|
||||
@@ -756,6 +772,7 @@ impl Renderer {
|
||||
drawing_context: &DrawingContext,
|
||||
clear_color: Color,
|
||||
pixel_kind: PixelKind,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<(), FrameworkError> {
|
||||
let new_width = screen_size.x as usize;
|
||||
let new_height = screen_size.y as usize;
|
||||
@@ -802,6 +819,7 @@ impl Renderer {
|
||||
uniform_buffer_cache: &mut self.uniform_buffer_cache,
|
||||
render_pass_cache: &mut self.shader_cache,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
// Finally register texture in the cache so it will become available as texture in deferred/forward
|
||||
@@ -818,7 +836,7 @@ impl Renderer {
|
||||
)
|
||||
}
|
||||
|
||||
fn update_texture_cache(&mut self, dt: f32) {
|
||||
fn update_texture_cache(&mut self, resource_manager: &ResourceManager, dt: f32) {
|
||||
// Maximum amount of textures uploaded to GPU per frame. This defines throughput **only** for
|
||||
// requests from resource manager. This is needed to prevent huge lag when there are tons of
|
||||
// requests, so this is some kind of work load balancer.
|
||||
@@ -828,7 +846,10 @@ impl Renderer {
|
||||
while let Ok(event) = self.texture_event_receiver.try_recv() {
|
||||
if let ResourceEvent::Loaded(resource) | ResourceEvent::Reloaded(resource) = event {
|
||||
if let Some(texture) = resource.try_cast::<Texture>() {
|
||||
match self.texture_cache.upload(&*self.server, &texture) {
|
||||
match self
|
||||
.texture_cache
|
||||
.upload(&*self.server, resource_manager, &texture)
|
||||
{
|
||||
Ok(_) => {
|
||||
uploaded += 1;
|
||||
if uploaded >= THROUGHPUT {
|
||||
@@ -867,8 +888,8 @@ impl Renderer {
|
||||
///
|
||||
/// Normally, this is called from `Engine::update()`.
|
||||
/// You should only call this manually if you don't use that method.
|
||||
pub fn update_caches(&mut self, dt: f32) {
|
||||
self.update_texture_cache(dt);
|
||||
pub fn update_caches(&mut self, resource_manager: &ResourceManager, dt: f32) {
|
||||
self.update_texture_cache(resource_manager, dt);
|
||||
self.update_shader_cache(dt);
|
||||
self.geometry_cache.update(dt);
|
||||
}
|
||||
@@ -880,6 +901,7 @@ impl Renderer {
|
||||
scene: &Scene,
|
||||
elapsed_time: f32,
|
||||
dt: f32,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<&mut RenderDataContainer, FrameworkError> {
|
||||
let server = &*self.server;
|
||||
|
||||
@@ -967,6 +989,7 @@ impl Renderer {
|
||||
uniform_buffer_cache: &mut self.uniform_buffer_cache,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
screen_space_debug_renderer: &mut self.screen_space_debug_renderer,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
server.set_polygon_fill_mode(PolygonFace::FrontAndBack, PolygonFillMode::Fill);
|
||||
@@ -1006,6 +1029,7 @@ impl Renderer {
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
dynamic_surface_cache: &mut self.dynamic_surface_cache,
|
||||
ssao_renderer: &render_data.ssao_renderer,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
render_data.statistics += light_stats;
|
||||
@@ -1026,6 +1050,7 @@ impl Renderer {
|
||||
scene_depth: depth,
|
||||
ambient_light: scene.rendering_options.ambient_lighting_color,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
resource_manager,
|
||||
})?;
|
||||
|
||||
for render_pass in self.scene_render_passes.iter() {
|
||||
@@ -1052,6 +1077,7 @@ impl Renderer {
|
||||
uniform_buffer_cache: &mut self.uniform_buffer_cache,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
dynamic_surface_cache: &mut self.dynamic_surface_cache,
|
||||
resource_manager,
|
||||
})?;
|
||||
}
|
||||
|
||||
@@ -1078,6 +1104,7 @@ impl Renderer {
|
||||
&mut self.texture_cache,
|
||||
&mut self.uniform_buffer_cache,
|
||||
&self.renderer_resources,
|
||||
resource_manager,
|
||||
)?;
|
||||
std::mem::swap(&mut dest_buf, &mut src_buf);
|
||||
|
||||
@@ -1136,6 +1163,7 @@ impl Renderer {
|
||||
uniform_buffer_cache: &mut self.uniform_buffer_cache,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
dynamic_surface_cache: &mut self.dynamic_surface_cache,
|
||||
resource_manager,
|
||||
})?;
|
||||
}
|
||||
|
||||
@@ -1150,6 +1178,7 @@ impl Renderer {
|
||||
scene: &Scene,
|
||||
elapsed_time: f32,
|
||||
dt: f32,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<&SceneRenderData, FrameworkError> {
|
||||
let graph = &scene.graph;
|
||||
|
||||
@@ -1228,15 +1257,28 @@ impl Renderer {
|
||||
// At first, render the reflection probes to off-screen render target and generate mipmaps
|
||||
// for the cube maps.
|
||||
for observer in observers.reflection_probes.iter() {
|
||||
let render_data =
|
||||
self.render_scene_observer(observer, scene_handle, scene, elapsed_time, dt)?;
|
||||
let render_data = self.render_scene_observer(
|
||||
observer,
|
||||
scene_handle,
|
||||
scene,
|
||||
elapsed_time,
|
||||
dt,
|
||||
resource_manager,
|
||||
)?;
|
||||
let probe_cube_map = render_data.ldr_scene_frame_texture().clone();
|
||||
self.server.generate_mipmap(&probe_cube_map);
|
||||
}
|
||||
|
||||
// Then render everything else.
|
||||
for observer in observers.cameras.iter() {
|
||||
self.render_scene_observer(observer, scene_handle, scene, elapsed_time, dt)?;
|
||||
self.render_scene_observer(
|
||||
observer,
|
||||
scene_handle,
|
||||
scene,
|
||||
elapsed_time,
|
||||
dt,
|
||||
resource_manager,
|
||||
)?;
|
||||
}
|
||||
|
||||
self.visibility_cache.update(graph);
|
||||
@@ -1266,6 +1308,7 @@ impl Renderer {
|
||||
&mut self,
|
||||
scenes: &SceneContainer,
|
||||
elapsed_time: f32,
|
||||
resource_manager: &ResourceManager,
|
||||
drawing_contexts: impl Iterator<Item = &'a DrawingContext>,
|
||||
) -> Result<(), FrameworkError> {
|
||||
if self.frame_size.0 == 0 || self.frame_size.1 == 0 {
|
||||
@@ -1300,7 +1343,7 @@ impl Renderer {
|
||||
let backbuffer_height = self.frame_size.1 as f32;
|
||||
|
||||
for (scene_handle, scene) in scenes.pair_iter().filter(|(_, s)| *s.enabled) {
|
||||
self.render_scene(scene_handle, scene, elapsed_time, dt)?;
|
||||
self.render_scene(scene_handle, scene, elapsed_time, dt, resource_manager)?;
|
||||
}
|
||||
|
||||
self.graphics_server()
|
||||
@@ -1320,6 +1363,7 @@ impl Renderer {
|
||||
uniform_buffer_cache: &mut self.uniform_buffer_cache,
|
||||
render_pass_cache: &mut self.shader_cache,
|
||||
uniform_memory_allocator: &mut self.uniform_memory_allocator,
|
||||
resource_manager,
|
||||
})?;
|
||||
}
|
||||
|
||||
@@ -1347,8 +1391,9 @@ impl Renderer {
|
||||
elapsed_time: f32,
|
||||
drawing_contexts: impl Iterator<Item = &'a DrawingContext>,
|
||||
window: &Window,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<(), FrameworkError> {
|
||||
self.render_frame(scenes, elapsed_time, drawing_contexts)?;
|
||||
self.render_frame(scenes, elapsed_time, resource_manager, drawing_contexts)?;
|
||||
self.statistics.end_frame();
|
||||
window.pre_present_notify();
|
||||
self.graphics_server().swap_buffers()?;
|
||||
|
||||
@@ -127,12 +127,26 @@ impl OcclusionTester {
|
||||
height: usize,
|
||||
tile_size: usize,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
let depth_stencil = server.create_2d_render_target(PixelKind::D24S8, width, height)?;
|
||||
let visibility_mask = server.create_2d_render_target(PixelKind::RGBA8, width, height)?;
|
||||
let depth_stencil = server.create_2d_render_target(
|
||||
"OcclusionTesterDepthStencilTexture",
|
||||
PixelKind::D24S8,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
let visibility_mask = server.create_2d_render_target(
|
||||
"OcclusionTesterVisibilityMask",
|
||||
PixelKind::RGBA8,
|
||||
width,
|
||||
height,
|
||||
)?;
|
||||
let w_tiles = width / tile_size + 1;
|
||||
let h_tiles = height / tile_size + 1;
|
||||
let tile_buffer =
|
||||
server.create_2d_render_target(PixelKind::R32UI, w_tiles * (MAX_BITS + 1), h_tiles)?;
|
||||
let tile_buffer = server.create_2d_render_target(
|
||||
"OcclusionTesterTileBuffer",
|
||||
PixelKind::R32UI,
|
||||
w_tiles * (MAX_BITS + 1),
|
||||
h_tiles,
|
||||
)?;
|
||||
|
||||
Ok(Self {
|
||||
framebuffer: server.create_frame_buffer(
|
||||
|
||||
@@ -52,8 +52,12 @@ impl VisibilityBufferOptimizer {
|
||||
w_tiles: usize,
|
||||
h_tiles: usize,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
let optimized_visibility_buffer =
|
||||
server.create_2d_render_target(PixelKind::R32UI, w_tiles, h_tiles)?;
|
||||
let optimized_visibility_buffer = server.create_2d_render_target(
|
||||
"OptimizedVisibilityTexture",
|
||||
PixelKind::R32UI,
|
||||
w_tiles,
|
||||
h_tiles,
|
||||
)?;
|
||||
|
||||
Ok(Self {
|
||||
framebuffer: server
|
||||
|
||||
@@ -217,6 +217,7 @@ impl RendererResources {
|
||||
pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
|
||||
Ok(Self {
|
||||
white_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "WhiteDummy",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 1,
|
||||
height: 1,
|
||||
@@ -226,6 +227,7 @@ impl RendererResources {
|
||||
..Default::default()
|
||||
})?,
|
||||
black_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "BlackDummy",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 1,
|
||||
height: 1,
|
||||
@@ -235,6 +237,7 @@ impl RendererResources {
|
||||
..Default::default()
|
||||
})?,
|
||||
environment_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "EnvironmentDummy",
|
||||
kind: GpuTextureKind::Cube { size: 1 },
|
||||
pixel_kind: PixelKind::RGBA8,
|
||||
data: Some(&[
|
||||
@@ -248,6 +251,7 @@ impl RendererResources {
|
||||
..Default::default()
|
||||
})?,
|
||||
normal_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "NormalDummy",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 1,
|
||||
height: 1,
|
||||
@@ -257,6 +261,7 @@ impl RendererResources {
|
||||
..Default::default()
|
||||
})?,
|
||||
metallic_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "MetallicDummy",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 1,
|
||||
height: 1,
|
||||
@@ -266,6 +271,7 @@ impl RendererResources {
|
||||
..Default::default()
|
||||
})?,
|
||||
volume_dummy: server.create_texture(GpuTextureDescriptor {
|
||||
name: "VolumeDummy",
|
||||
kind: GpuTextureKind::Volume {
|
||||
width: 1,
|
||||
height: 1,
|
||||
|
||||
@@ -52,6 +52,7 @@ use crate::{
|
||||
use approx::relative_eq;
|
||||
use fyrox_graphics::framebuffer::GpuFrameBuffer;
|
||||
use fyrox_graphics::gpu_texture::GpuTexture;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub struct Cascade {
|
||||
pub frame_buffer: GpuFrameBuffer,
|
||||
@@ -66,6 +67,7 @@ impl Cascade {
|
||||
precision: ShadowMapPrecision,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
let depth = server.create_2d_render_target(
|
||||
"CsmCascadeTexture",
|
||||
match precision {
|
||||
ShadowMapPrecision::Full => PixelKind::D32F,
|
||||
ShadowMapPrecision::Half => PixelKind::D16,
|
||||
@@ -106,6 +108,7 @@ pub(crate) struct CsmRenderContext<'a, 'c> {
|
||||
pub renderer_resources: &'a RendererResources,
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
pub dynamic_surface_cache: &'a mut DynamicSurfaceCache,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
impl CsmRenderer {
|
||||
@@ -156,6 +159,7 @@ impl CsmRenderer {
|
||||
renderer_resources,
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
resource_manager,
|
||||
} = ctx;
|
||||
|
||||
let LightSourceKind::Directional { ref csm_options } = light.kind else {
|
||||
@@ -282,6 +286,7 @@ impl CsmRenderer {
|
||||
frame_buffer: framebuffer,
|
||||
viewport,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
use_pom: false,
|
||||
light_position: &Default::default(),
|
||||
renderer_resources,
|
||||
|
||||
@@ -45,6 +45,7 @@ use crate::{
|
||||
},
|
||||
scene::{collider::BitMask, graph::Graph},
|
||||
};
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub struct PointShadowMapRenderer {
|
||||
precision: ShadowMapPrecision,
|
||||
@@ -67,6 +68,7 @@ pub(crate) struct PointShadowMapRenderContext<'a> {
|
||||
pub renderer_resources: &'a RendererResources,
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
pub dynamic_surface_cache: &'a mut DynamicSurfaceCache,
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
impl PointShadowMapRenderer {
|
||||
@@ -81,6 +83,7 @@ impl PointShadowMapRenderer {
|
||||
precision: ShadowMapPrecision,
|
||||
) -> Result<GpuFrameBuffer, FrameworkError> {
|
||||
let depth = server.create_2d_render_target(
|
||||
"PointShadowMapDepthTexture",
|
||||
match precision {
|
||||
ShadowMapPrecision::Full => PixelKind::D32F,
|
||||
ShadowMapPrecision::Half => PixelKind::D16,
|
||||
@@ -90,6 +93,7 @@ impl PointShadowMapRenderer {
|
||||
)?;
|
||||
|
||||
let cube_map = server.create_texture(GpuTextureDescriptor {
|
||||
name: "PointLightShadowCubeMap",
|
||||
kind: GpuTextureKind::Cube { size },
|
||||
pixel_kind: PixelKind::R16F,
|
||||
..Default::default()
|
||||
@@ -145,6 +149,7 @@ impl PointShadowMapRenderer {
|
||||
renderer_resources,
|
||||
uniform_memory_allocator,
|
||||
dynamic_surface_cache,
|
||||
resource_manager,
|
||||
} = args;
|
||||
|
||||
let framebuffer = &self.cascades[cascade];
|
||||
@@ -199,6 +204,7 @@ impl PointShadowMapRenderer {
|
||||
frame_buffer: framebuffer,
|
||||
viewport,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
use_pom: false,
|
||||
light_position: &light_pos,
|
||||
renderer_resources,
|
||||
|
||||
@@ -43,6 +43,7 @@ use crate::{
|
||||
};
|
||||
use fyrox_graphics::framebuffer::GpuFrameBuffer;
|
||||
use fyrox_graphics::gpu_texture::GpuTexture;
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
|
||||
pub struct SpotShadowMapRenderer {
|
||||
precision: ShadowMapPrecision,
|
||||
@@ -66,6 +67,7 @@ impl SpotShadowMapRenderer {
|
||||
precision: ShadowMapPrecision,
|
||||
) -> Result<GpuFrameBuffer, FrameworkError> {
|
||||
let depth = server.create_2d_render_target(
|
||||
"SpotShadowMapCascade",
|
||||
match precision {
|
||||
ShadowMapPrecision::Full => PixelKind::D32F,
|
||||
ShadowMapPrecision::Half => PixelKind::D16,
|
||||
@@ -123,6 +125,7 @@ impl SpotShadowMapRenderer {
|
||||
renderer_resources: &RendererResources,
|
||||
uniform_memory_allocator: &mut UniformMemoryAllocator,
|
||||
dynamic_surface_cache: &mut DynamicSurfaceCache,
|
||||
resource_manager: &ResourceManager,
|
||||
) -> Result<RenderPassStatistics, FrameworkError> {
|
||||
let mut statistics = RenderPassStatistics::default();
|
||||
|
||||
@@ -164,6 +167,7 @@ impl SpotShadowMapRenderer {
|
||||
frame_buffer: framebuffer,
|
||||
viewport,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
use_pom: false,
|
||||
light_position: &Default::default(),
|
||||
renderer_resources,
|
||||
|
||||
@@ -48,7 +48,8 @@ impl Blur {
|
||||
width: usize,
|
||||
height: usize,
|
||||
) -> Result<Self, FrameworkError> {
|
||||
let frame = server.create_2d_render_target(PixelKind::R32F, width, height)?;
|
||||
let frame =
|
||||
server.create_2d_render_target("BlurTexture", PixelKind::R32F, width, height)?;
|
||||
Ok(Self {
|
||||
framebuffer: server.create_frame_buffer(None, vec![Attachment::color(frame)])?,
|
||||
width,
|
||||
|
||||
@@ -74,7 +74,8 @@ impl ScreenSpaceAmbientOcclusionRenderer {
|
||||
let width = (frame_width / 2).max(1);
|
||||
let height = (frame_height / 2).max(1);
|
||||
|
||||
let occlusion = server.create_2d_render_target(PixelKind::R32F, width, height)?;
|
||||
let occlusion =
|
||||
server.create_2d_render_target("SsaoTexture", PixelKind::R32F, width, height)?;
|
||||
|
||||
let mut rng = crate::rand::thread_rng();
|
||||
|
||||
@@ -110,6 +111,7 @@ impl ScreenSpaceAmbientOcclusionRenderer {
|
||||
pixel[2] = 0u8; // B
|
||||
}
|
||||
server.create_texture(GpuTextureDescriptor {
|
||||
name: "SsaoNoise",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: NOISE_SIZE,
|
||||
height: NOISE_SIZE,
|
||||
|
||||
@@ -47,6 +47,7 @@ impl MatrixStorage {
|
||||
let identity = [Matrix4::<f32>::identity()];
|
||||
Ok(Self {
|
||||
texture: server.create_texture(GpuTextureDescriptor {
|
||||
name: "MatrixStorage",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: 4,
|
||||
height: 1,
|
||||
|
||||
@@ -62,6 +62,7 @@ use fyrox_graphics::{
|
||||
gpu_program::ShaderResourceKind,
|
||||
uniform::StaticUniformBuffer,
|
||||
};
|
||||
use fyrox_resource::manager::ResourceManager;
|
||||
use fyrox_ui::draw::Command;
|
||||
use uuid::Uuid;
|
||||
|
||||
@@ -95,6 +96,8 @@ pub struct UiRenderContext<'a, 'b, 'c> {
|
||||
pub render_pass_cache: &'a mut ShaderCache,
|
||||
/// A reference to the uniform memory allocator.
|
||||
pub uniform_memory_allocator: &'a mut UniformMemoryAllocator,
|
||||
/// A reference to the resource manager.
|
||||
pub resource_manager: &'a ResourceManager,
|
||||
}
|
||||
|
||||
fn write_uniform_blocks(
|
||||
@@ -284,6 +287,7 @@ impl UiRenderer {
|
||||
uniform_buffer_cache,
|
||||
render_pass_cache,
|
||||
uniform_memory_allocator,
|
||||
resource_manager,
|
||||
} = args;
|
||||
|
||||
let mut statistics = RenderPassStatistics::default();
|
||||
@@ -430,6 +434,7 @@ impl UiRenderer {
|
||||
}
|
||||
if let Some(texture) = texture_cache.get(
|
||||
server,
|
||||
resource_manager,
|
||||
&page
|
||||
.texture
|
||||
.as_ref()
|
||||
@@ -446,7 +451,9 @@ impl UiRenderer {
|
||||
}
|
||||
}
|
||||
CommandTexture::Texture(texture) => {
|
||||
if let Some(texture) = texture_cache.get(server, texture) {
|
||||
if let Some(texture) =
|
||||
texture_cache.get(server, resource_manager, texture)
|
||||
{
|
||||
diffuse_texture =
|
||||
(&texture.gpu_texture, &texture.gpu_sampler);
|
||||
}
|
||||
@@ -466,6 +473,7 @@ impl UiRenderer {
|
||||
resource,
|
||||
renderer_resources,
|
||||
fallback,
|
||||
resource_manager,
|
||||
texture_cache,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -185,6 +185,7 @@ pub fn make_brdf_lut(
|
||||
}
|
||||
|
||||
server.create_texture(GpuTextureDescriptor {
|
||||
name: "BrdfLut",
|
||||
kind: GpuTextureKind::Rectangle {
|
||||
width: size,
|
||||
height: size,
|
||||
|
||||
Reference in New Issue
Block a user