@@ -370,7 +370,7 @@ class Renderer {
370
370
const lightsNode = renderList . lightsNode ;
371
371
372
372
if ( this . opaque === true && opaqueObjects . length > 0 ) this . _renderObjects ( opaqueObjects , camera , sceneRef , lightsNode ) ;
373
- if ( this . transparent === true && transparentObjects . length > 0 ) this . _renderObjects ( transparentObjects , camera , sceneRef , lightsNode ) ;
373
+ if ( this . transparent === true && transparentObjects . length > 0 ) this . _renderTransparents ( transparentObjects , camera , sceneRef , lightsNode ) ;
374
374
375
375
// restore render tree
376
376
@@ -452,7 +452,7 @@ class Renderer {
452
452
453
453
const opaqueObjects = renderList . opaque ;
454
454
455
- if ( opaqueObjects . length > 0 ) this . _renderObjects ( opaqueObjects , camera , sceneRef , lightsNode ) ;
455
+ if ( this . opaque === true && opaqueObjects . length > 0 ) this . _renderObjects ( opaqueObjects , camera , sceneRef , lightsNode ) ;
456
456
457
457
this . _currentRenderBundle = null ;
458
458
@@ -728,13 +728,14 @@ class Renderer {
728
728
const {
729
729
bundles,
730
730
lightsNode,
731
+ transparentDoublePass : transparentDoublePassObjects ,
731
732
transparent : transparentObjects ,
732
733
opaque : opaqueObjects
733
734
} = renderList ;
734
735
735
736
if ( bundles . length > 0 ) this . _renderBundles ( bundles , sceneRef , lightsNode ) ;
736
737
if ( this . opaque === true && opaqueObjects . length > 0 ) this . _renderObjects ( opaqueObjects , camera , sceneRef , lightsNode ) ;
737
- if ( this . transparent === true && transparentObjects . length > 0 ) this . _renderObjects ( transparentObjects , camera , sceneRef , lightsNode ) ;
738
+ if ( this . transparent === true && transparentObjects . length > 0 ) this . _renderTransparents ( transparentObjects , transparentDoublePassObjects , camera , sceneRef , lightsNode ) ;
738
739
739
740
// finish render pass
740
741
@@ -1438,7 +1439,47 @@ class Renderer {
1438
1439
1439
1440
}
1440
1441
1441
- _renderObjects ( renderList , camera , scene , lightsNode ) {
1442
+ _renderTransparents ( renderList , doublePassList , camera , scene , lightsNode ) {
1443
+
1444
+ if ( doublePassList . length > 0 ) {
1445
+
1446
+ // render back side
1447
+
1448
+ for ( const { material } of doublePassList ) {
1449
+
1450
+ material . side = BackSide ;
1451
+
1452
+ }
1453
+
1454
+ this . _renderObjects ( doublePassList , camera , scene , lightsNode , 'backSide' ) ;
1455
+
1456
+ // render front side
1457
+
1458
+ for ( const { material } of doublePassList ) {
1459
+
1460
+ material . side = FrontSide ;
1461
+
1462
+ }
1463
+
1464
+ this . _renderObjects ( renderList , camera , scene , lightsNode ) ;
1465
+
1466
+ // restore
1467
+
1468
+ for ( const { material } of doublePassList ) {
1469
+
1470
+ material . side = DoubleSide ;
1471
+
1472
+ }
1473
+
1474
+ } else {
1475
+
1476
+ this . _renderObjects ( renderList , camera , scene , lightsNode ) ;
1477
+
1478
+ }
1479
+
1480
+ }
1481
+
1482
+ _renderObjects ( renderList , camera , scene , lightsNode , passId = null ) {
1442
1483
1443
1484
// process renderable objects
1444
1485
@@ -1472,23 +1513,23 @@ class Renderer {
1472
1513
1473
1514
this . backend . updateViewport ( this . _currentRenderContext ) ;
1474
1515
1475
- this . _currentRenderObjectFunction ( object , scene , camera2 , geometry , material , group , lightsNode ) ;
1516
+ this . _currentRenderObjectFunction ( object , scene , camera2 , geometry , material , group , lightsNode , passId ) ;
1476
1517
1477
1518
}
1478
1519
1479
1520
}
1480
1521
1481
1522
} else {
1482
1523
1483
- this . _currentRenderObjectFunction ( object , scene , camera , geometry , material , group , lightsNode ) ;
1524
+ this . _currentRenderObjectFunction ( object , scene , camera , geometry , material , group , lightsNode , passId ) ;
1484
1525
1485
1526
}
1486
1527
1487
1528
}
1488
1529
1489
1530
}
1490
1531
1491
- renderObject ( object , scene , camera , geometry , material , group , lightsNode ) {
1532
+ renderObject ( object , scene , camera , geometry , material , group , lightsNode , passId = null ) {
1492
1533
1493
1534
let overridePositionNode ;
1494
1535
let overrideFragmentNode ;
@@ -1570,13 +1611,13 @@ class Renderer {
1570
1611
this . _handleObjectFunction ( object , material , scene , camera , lightsNode , group , 'backSide' ) ; // create backSide pass id
1571
1612
1572
1613
material . side = FrontSide ;
1573
- this . _handleObjectFunction ( object , material , scene , camera , lightsNode , group ) ; // use default pass id
1614
+ this . _handleObjectFunction ( object , material , scene , camera , lightsNode , group , passId ) ; // use default pass id
1574
1615
1575
1616
material . side = DoubleSide ;
1576
1617
1577
1618
} else {
1578
1619
1579
- this . _handleObjectFunction ( object , material , scene , camera , lightsNode , group ) ;
1620
+ this . _handleObjectFunction ( object , material , scene , camera , lightsNode , group , passId ) ;
1580
1621
1581
1622
}
1582
1623
0 commit comments