Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions src/renderers/TransmissionUtils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { CustomBlending } from '../constants.js';
import { PlaneGeometry } from '../geometries/PlaneGeometry.js';
import { ShaderMaterial } from '../materials/ShaderMaterial.js';
import { Mesh } from '../objects/Mesh.js';

class CopyColorDepthMaterial extends ShaderMaterial {

set map( v ) {

this.uniforms.map.value = v;

}

set depthMap( v ) {

this.uniforms.depthMap.value = v;

}

constructor() {

super( {

name: 'CopyColorDepthMaterial',
blending: CustomBlending,

uniforms: {

'map': { value: null },
'depthMap': { value: null }

},

vertexShader: /* glsl */`

varying vec2 vUv;

void main() {

vUv = uv;
gl_Position = vec4( position.xy, 1.0, 1.0 );

}

`,

fragmentShader: /* glsl */`

uniform sampler2D map;
uniform sampler2D depthMap;

varying vec2 vUv;

void main() {

gl_FragColor = texture2D( map, vUv );
gl_FragDepth = texture2D( depthMap, vUv ).r;

#include <tonemapping_fragment>
#include <colorspace_fragment>

}
`

} );

}

}

export const transmissionMesh = new Mesh( new PlaneGeometry( 2, 2 ), new CopyColorDepthMaterial() );
17 changes: 16 additions & 1 deletion src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ import { WebGLMaterials } from './webgl/WebGLMaterials.js';
import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
import { createCanvasElement, probeAsync } from '../utils.js';
import { ColorManagement } from '../math/ColorManagement.js';
import { transmissionMesh } from './TransmissionUtils.js';
import { DepthTexture } from '../textures/DepthTexture.js';

class WebGLRenderer {

Expand Down Expand Up @@ -1243,6 +1245,19 @@ class WebGLRenderer {

if ( _renderBackground ) background.render( scene );

const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];
if ( transmissiveObjects.length > 0 ) {

currentRenderList.opaque.length = 0;

const geometry = objects.update( transmissionMesh );
const material = transmissionMesh.material;
material.map = transmissionRenderTarget.texture;
material.depthMap = transmissionRenderTarget.depthTexture;
renderObject( transmissionMesh, scene, camera, geometry, material, null );

}

renderScene( currentRenderList, scene, camera );

}
Expand Down Expand Up @@ -1457,9 +1472,9 @@ class WebGLRenderer {
minFilter: LinearMipmapLinearFilter,
samples: 4,
stencilBuffer: stencil,
resolveDepthBuffer: false,
resolveStencilBuffer: false,
colorSpace: ColorManagement.workingColorSpace,
depthTexture: new DepthTexture(),
} );

// debug
Expand Down