|
@@ -1210,7 +1210,7 @@ function WebGLRenderer( parameters = {} ) {
|
|
|
|
|
|
if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
|
|
|
|
|
|
- if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );
|
|
|
+ if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
|
|
|
|
|
|
if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
|
|
|
|
|
@@ -1228,12 +1228,12 @@ function WebGLRenderer( parameters = {} ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function renderTransmissionPass( opaqueObjects, scene, camera ) {
|
|
|
-
|
|
|
- const isWebGL2 = capabilities.isWebGL2;
|
|
|
+ function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {
|
|
|
|
|
|
if ( _transmissionRenderTarget === null ) {
|
|
|
|
|
|
+ const isWebGL2 = capabilities.isWebGL2;
|
|
|
+
|
|
|
_transmissionRenderTarget = new WebGLRenderTarget( 1024, 1024, {
|
|
|
generateMipmaps: true,
|
|
|
type: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,
|
|
@@ -1241,6 +1241,16 @@ function WebGLRenderer( parameters = {} ) {
|
|
|
samples: ( isWebGL2 && _antialias === true ) ? 4 : 0
|
|
|
} );
|
|
|
|
|
|
+ // debug
|
|
|
+
|
|
|
+ /*
|
|
|
+ const geometry = new PlaneGeometry();
|
|
|
+ const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );
|
|
|
+
|
|
|
+ const mesh = new Mesh( geometry, material );
|
|
|
+ scene.add( mesh );
|
|
|
+ */
|
|
|
+
|
|
|
}
|
|
|
|
|
|
//
|
|
@@ -1256,13 +1266,49 @@ function WebGLRenderer( parameters = {} ) {
|
|
|
|
|
|
renderObjects( opaqueObjects, scene, camera );
|
|
|
|
|
|
- _this.toneMapping = currentToneMapping;
|
|
|
-
|
|
|
textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
|
|
|
textures.updateRenderTargetMipmap( _transmissionRenderTarget );
|
|
|
|
|
|
+ let renderTargetNeedsUpdate = false;
|
|
|
+
|
|
|
+ for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ const renderItem = transmissiveObjects[ i ];
|
|
|
+
|
|
|
+ const object = renderItem.object;
|
|
|
+ const geometry = renderItem.geometry;
|
|
|
+ const material = renderItem.material;
|
|
|
+ const group = renderItem.group;
|
|
|
+
|
|
|
+ if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
|
|
|
+
|
|
|
+ const currentSide = material.side;
|
|
|
+
|
|
|
+ material.side = BackSide;
|
|
|
+ material.needsUpdate = true;
|
|
|
+
|
|
|
+ renderObject( object, scene, camera, geometry, material, group );
|
|
|
+
|
|
|
+ material.side = currentSide;
|
|
|
+ material.needsUpdate = true;
|
|
|
+
|
|
|
+ renderTargetNeedsUpdate = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( renderTargetNeedsUpdate === true ) {
|
|
|
+
|
|
|
+ textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
|
|
|
+ textures.updateRenderTargetMipmap( _transmissionRenderTarget );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
_this.setRenderTarget( currentRenderTarget );
|
|
|
|
|
|
+ _this.toneMapping = currentToneMapping;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
function renderObjects( renderList, scene, camera ) {
|