99
1010import java .io .*;
1111import java .nio .ByteOrder ;
12+ import java .nio .file .Files ;
1213
1314public class DenoisedPathTracingRenderer extends MultiPassRenderer {
1415 protected final DenoiserSettings settings ;
@@ -22,8 +23,6 @@ public class DenoisedPathTracingRenderer extends MultiPassRenderer {
2223 protected final AlbedoTracer albedoTracer = new AlbedoTracer ();
2324 protected final NormalTracer normalTracer ;
2425
25- private boolean hiddenPasses = false ;
26-
2726 public DenoisedPathTracingRenderer (DenoiserSettings settings , Denoiser denoiser ,
2827 String id , String name , String description , RayTracer tracer ) {
2928 this .settings = settings ;
@@ -56,81 +55,68 @@ public String getDescription() {
5655 public void render (DefaultRenderManager manager ) throws InterruptedException {
5756 Scene scene = manager .bufferedScene ;
5857 double [] sampleBuffer = scene .getSampleBuffer ();
59- boolean aborted = false ;
60-
61- int originalSpp = scene .spp ;
62- int sceneTarget = scene .getTargetSpp ();
63-
64- int maxSpp = Math .max (sceneTarget , Math .max (settings .albedoSpp .get (), settings .normalSpp .get ()));
65- scene .setTargetSpp (maxSpp );
66-
67- RayTracer [] tracers = new RayTracer [] {albedoTracer , normalTracer , tracer };
68- float [][] buffers = new float [][] {
69- settings .renderAlbedo .get () ? new float [sampleBuffer .length ] : null ,
70- settings .renderNormal .get () ? new float [sampleBuffer .length ] : null ,
71- null };
72- boolean [] tracerMask = new boolean [3 ];
73- scene .spp = 0 ;
74-
75- while (scene .spp < maxSpp ) {
76- tracerMask [0 ] = settings .renderAlbedo .get () && scene .spp < settings .albedoSpp .get ();
77- tracerMask [1 ] = settings .renderNormal .get () && scene .spp < settings .normalSpp .get ();
78- tracerMask [2 ] = scene .spp >= originalSpp && scene .spp < sceneTarget ;
79- hiddenPasses = !tracerMask [2 ];
80- renderPass (manager , manager .context .sppPerPass (), tracers , buffers , tracerMask );
81- if (scene .spp < maxSpp && postRender .getAsBoolean ()) {
82- aborted = true ;
83- break ;
58+
59+ boolean albedoEnable = settings .renderAlbedo .get ();
60+ int albedoTarget = settings .albedoSpp .get ();
61+ int albedoSampleScale = (int ) Math .ceil ((double ) albedoTarget / scene .getTargetSpp ());
62+ int albedoSamples = 0 ;
63+ float [] albedoBuffer = albedoEnable ? new float [sampleBuffer .length ] : null ;
64+
65+ boolean normalEnable = settings .renderNormal .get ();
66+ int normalTarget = settings .normalSpp .get ();
67+ int normalSampleScale = (int ) Math .ceil ((double ) normalTarget / scene .getTargetSpp ());
68+ int normalSamples = 0 ;
69+ float [] normalBuffer = normalEnable ? new float [sampleBuffer .length ] : null ;
70+
71+ while (scene .spp < scene .getTargetSpp ()) {
72+ if (albedoEnable && albedoSamples < albedoTarget ) {
73+ int samples = Math .min (albedoSampleScale , albedoTarget - albedoSamples );
74+ albedoSamples = this .renderPass (manager , albedoSamples , samples , albedoTracer , albedoBuffer );
75+ }
76+ if (normalEnable && normalSamples < normalTarget ) {
77+ int samples = Math .max (normalSampleScale , normalTarget - normalSamples );
78+ normalSamples = this .renderPass (manager , normalSamples , samples , normalTracer , normalBuffer );
79+ }
80+ scene .spp = renderPass (manager , scene .spp , 1 , tracer , null );
81+
82+ if (scene .spp < scene .getTargetSpp () && postRender .getAsBoolean ()) {
83+ // Canceled
84+ return ;
8485 }
8586 }
8687
87- if (! aborted && settings .saveBeauty .get ()) {
88+ if (settings .saveBeauty .get ()) {
8889 File out = manager .context .getSceneFile (scene .name + ".beauty.pfm" );
8990 scene .saveFrame (out , PortableFloatMap .getPfmExportFormat (),
9091 TaskTracker .NONE , manager .context .numRenderThreads ());
9192 }
9293
93- if (! aborted && settings .saveAlbedo .get ()) {
94+ if (settings .saveAlbedo .get ()) {
9495 File out = manager .context .getSceneFile (scene .name + ".albedo.pfm" );
95- try (OutputStream os = new BufferedOutputStream (new FileOutputStream (out ))) {
96- PortableFloatMap .writeImage (buffers [ 0 ] , scene .width , scene .height , ByteOrder .LITTLE_ENDIAN , os );
96+ try (OutputStream os = new BufferedOutputStream (Files . newOutputStream (out . toPath () ))) {
97+ PortableFloatMap .writeImage (albedoBuffer , scene .width , scene .height , ByteOrder .LITTLE_ENDIAN , os );
9798 } catch (IOException e ) {
9899 Log .error ("Failed to save albedo pass" , e );
99100 }
100101 }
101102
102- if (! aborted && settings .saveNormal .get ()) {
103+ if (settings .saveNormal .get ()) {
103104 File out = manager .context .getSceneFile (scene .name + ".normal.pfm" );
104- try (OutputStream os = new BufferedOutputStream (new FileOutputStream (out ))) {
105- PortableFloatMap .writeImage (buffers [ 1 ] , scene .width , scene .height , ByteOrder .LITTLE_ENDIAN , os );
105+ try (OutputStream os = new BufferedOutputStream (Files . newOutputStream (out . toPath () ))) {
106+ PortableFloatMap .writeImage (normalBuffer , scene .width , scene .height , ByteOrder .LITTLE_ENDIAN , os );
106107 } catch (IOException e ) {
107108 Log .error ("Failed to save normal pass" , e );
108109 }
109110 }
110111
111- if (!aborted ) {
112- if (denoiser instanceof OidnBinaryDenoiser )
113- ((OidnBinaryDenoiser ) denoiser ).loadPath ();
114-
115- try {
116- denoiser .denoiseDouble (scene .width , scene .height , sampleBuffer ,
117- buffers [0 ], buffers [1 ], sampleBuffer );
118- } catch (Denoiser .DenoisingFailedException e ) {
119- Log .error ("Failed to denoise" , e );
120- }
112+ try {
113+ manager .getRenderTask ().update ("Denoising" , scene .getTargetSpp (), scene .spp );
114+ denoiser .init ();
115+ denoiser .denoiseDouble (scene .width , scene .height , sampleBuffer , albedoBuffer , normalBuffer , sampleBuffer );
116+ } catch (Denoiser .DenoisingFailedException e ) {
117+ Log .error ("Failed to denoise" , e );
121118 }
122119
123- if (scene .spp < originalSpp ) {
124- scene .spp = originalSpp ;
125- } else if (scene .spp > sceneTarget ) {
126- scene .spp = sceneTarget ;
127- }
128- scene .setTargetSpp (sceneTarget );
129120 postRender .getAsBoolean ();
130121 }
131-
132- @ Override
133- public boolean autoPostProcess () {
134- return !hiddenPasses ;
135- }
136122}
0 commit comments