@@ -39,23 +39,21 @@ use crate::{
39
39
renderer:: {
40
40
bundle:: { BundleRenderContext , RenderDataBundleStorage , SurfaceInstanceData } ,
41
41
cache:: {
42
- shader:: ShaderCache ,
42
+ shader:: {
43
+ binding, property, PropertyGroup , RenderMaterial , RenderPassContainer , ShaderCache ,
44
+ } ,
43
45
uniform:: { UniformBufferCache , UniformMemoryAllocator } ,
44
46
} ,
45
47
debug_renderer:: DebugRenderer ,
46
48
framework:: {
47
49
buffer:: BufferUsage ,
48
50
error:: FrameworkError ,
49
- framebuffer:: {
50
- Attachment , AttachmentKind , BufferLocation , ResourceBindGroup , ResourceBinding ,
51
- } ,
52
- gpu_texture:: PixelKind ,
51
+ framebuffer:: { Attachment , AttachmentKind , GpuFrameBuffer } ,
52
+ geometry_buffer:: GpuGeometryBuffer ,
53
+ gpu_texture:: { GpuTexture , PixelKind } ,
53
54
server:: GraphicsServer ,
54
- uniform:: StaticUniformBuffer ,
55
- BlendFactor , BlendFunc , BlendParameters , DrawParameters , ElementRange ,
56
55
GeometryBufferExt ,
57
56
} ,
58
- gbuffer:: decal:: DecalShader ,
59
57
occlusion:: OcclusionTester ,
60
58
FallbackResources , GeometryCache , QualitySettings , RenderPassStatistics , TextureCache ,
61
59
} ,
@@ -67,19 +65,14 @@ use crate::{
67
65
} ,
68
66
} ;
69
67
use fxhash:: FxHashSet ;
70
- use fyrox_graphics:: framebuffer:: GpuFrameBuffer ;
71
- use fyrox_graphics:: geometry_buffer:: GpuGeometryBuffer ;
72
- use fyrox_graphics:: gpu_texture:: GpuTexture ;
73
-
74
- mod decal;
75
68
76
69
pub struct GBuffer {
77
70
framebuffer : GpuFrameBuffer ,
78
71
decal_framebuffer : GpuFrameBuffer ,
79
72
pub width : i32 ,
80
73
pub height : i32 ,
81
74
cube : GpuGeometryBuffer ,
82
- decal_shader : DecalShader ,
75
+ decal_shader : RenderPassContainer ,
83
76
render_pass_name : ImmutableString ,
84
77
occlusion_tester : OcclusionTester ,
85
78
}
@@ -156,7 +149,10 @@ impl GBuffer {
156
149
framebuffer,
157
150
width : width as i32 ,
158
151
height : height as i32 ,
159
- decal_shader : DecalShader :: new ( server) ?,
152
+ decal_shader : RenderPassContainer :: from_str (
153
+ server,
154
+ include_str ! ( "../shaders/decal.shader" ) ,
155
+ ) ?,
160
156
cube : GpuGeometryBuffer :: from_surface_data (
161
157
& SurfaceData :: make_cube ( Matrix4 :: identity ( ) ) ,
162
158
BufferUsage :: StaticDraw ,
@@ -292,9 +288,6 @@ impl GBuffer {
292
288
// decals do not modify depth (only diffuse and normal maps).
293
289
let unit_cube = & self . cube ;
294
290
for decal in graph. linear_iter ( ) . filter_map ( |n| n. cast :: < Decal > ( ) ) {
295
- let shader = & self . decal_shader ;
296
- let program = & self . decal_shader . program ;
297
-
298
291
let world_view_proj = view_projection * decal. global_transform ( ) ;
299
292
300
293
let diffuse_texture = decal
@@ -309,49 +302,34 @@ impl GBuffer {
309
302
. unwrap_or ( & fallback_resources. normal_dummy )
310
303
. clone ( ) ;
311
304
312
- statistics += self . decal_framebuffer . draw (
305
+ let inv_world_decal = decal. global_transform ( ) . try_inverse ( ) . unwrap_or_default ( ) ;
306
+ let color = decal. color ( ) . srgb_to_linear_f32 ( ) ;
307
+ let layer_index = decal. layer ( ) as u32 ;
308
+ let properties = PropertyGroup :: from ( [
309
+ property ( "worldViewProjection" , & world_view_proj) ,
310
+ property ( "invViewProj" , & inv_view_proj) ,
311
+ property ( "invWorldDecal" , & inv_world_decal) ,
312
+ property ( "resolution" , & resolution) ,
313
+ property ( "color" , & color) ,
314
+ property ( "layerIndex" , & layer_index) ,
315
+ ] ) ;
316
+ let material = RenderMaterial :: from ( [
317
+ binding ( "sceneDepth" , depth) ,
318
+ binding ( "diffuseTexture" , & diffuse_texture) ,
319
+ binding ( "normalTexture" , & normal_texture) ,
320
+ binding ( "decalMask" , decal_mask) ,
321
+ binding ( "properties" , & properties) ,
322
+ ] ) ;
323
+
324
+ statistics += self . decal_shader . run_pass (
325
+ & ImmutableString :: new ( "Primary" ) ,
326
+ & self . decal_framebuffer ,
313
327
unit_cube,
314
328
viewport,
315
- program,
316
- & DrawParameters {
317
- cull_face : None ,
318
- color_write : Default :: default ( ) ,
319
- depth_write : false ,
320
- stencil_test : None ,
321
- depth_test : None ,
322
- blend : Some ( BlendParameters {
323
- func : BlendFunc :: new ( BlendFactor :: SrcAlpha , BlendFactor :: OneMinusSrcAlpha ) ,
324
- ..Default :: default ( )
325
- } ) ,
326
- stencil_op : Default :: default ( ) ,
327
- scissor_box : None ,
328
- } ,
329
- & [ ResourceBindGroup {
330
- bindings : & [
331
- ResourceBinding :: texture ( depth, & shader. scene_depth ) ,
332
- ResourceBinding :: texture ( & diffuse_texture, & shader. diffuse_texture ) ,
333
- ResourceBinding :: texture ( & normal_texture, & shader. normal_texture ) ,
334
- ResourceBinding :: texture ( decal_mask, & shader. decal_mask ) ,
335
- ResourceBinding :: Buffer {
336
- buffer : uniform_buffer_cache. write (
337
- StaticUniformBuffer :: < 256 > :: new ( )
338
- . with ( & world_view_proj)
339
- . with ( & inv_view_proj)
340
- . with (
341
- & decal. global_transform ( ) . try_inverse ( ) . unwrap_or_default ( ) ,
342
- )
343
- . with ( & resolution)
344
- . with ( & decal. color ( ) . srgb_to_linear_f32 ( ) )
345
- . with ( & ( decal. layer ( ) as u32 ) ) ,
346
- ) ?,
347
- binding : BufferLocation :: Auto {
348
- shader_location : shader. uniform_buffer_binding ,
349
- } ,
350
- data_usage : Default :: default ( ) ,
351
- } ,
352
- ] ,
353
- } ] ,
354
- ElementRange :: Full ,
329
+ & material,
330
+ uniform_buffer_cache,
331
+ Default :: default ( ) ,
332
+ None ,
355
333
) ?;
356
334
}
357
335
0 commit comments