ParallaxBarrierPassNode.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { NodeMaterial } from 'three/webgpu';
  2. import { nodeObject, Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
  3. import StereoCompositePassNode from './StereoCompositePassNode.js';
  4. /**
  5. * A render pass node that creates a parallax barrier effect.
  6. *
  7. * @augments StereoCompositePassNode
  8. */
  9. class ParallaxBarrierPassNode extends StereoCompositePassNode {
  10. static get type() {
  11. return 'ParallaxBarrierPassNode';
  12. }
  13. /**
  14. * Constructs a new parallax barrier pass node.
  15. *
  16. * @param {Scene} scene - The scene to render.
  17. * @param {Camera} camera - The camera to render the scene with.
  18. */
  19. constructor( scene, camera ) {
  20. super( scene, camera );
  21. /**
  22. * This flag can be used for type testing.
  23. *
  24. * @type {boolean}
  25. * @readonly
  26. * @default true
  27. */
  28. this.isParallaxBarrierPassNode = true;
  29. }
  30. /**
  31. * This method is used to setup the effect's TSL code.
  32. *
  33. * @param {NodeBuilder} builder - The current node builder.
  34. * @return {PassTextureNode}
  35. */
  36. setup( builder ) {
  37. const uvNode = uv();
  38. const parallaxBarrier = Fn( () => {
  39. const color = vec4().toVar();
  40. If( mod( screenCoordinate.y, 2 ).greaterThan( 1 ), () => {
  41. color.assign( this._mapLeft.sample( uvNode ) );
  42. } ).Else( () => {
  43. color.assign( this._mapRight.sample( uvNode ) );
  44. } );
  45. return color;
  46. } );
  47. const material = this._material || ( this._material = new NodeMaterial() );
  48. material.fragmentNode = parallaxBarrier().context( builder.getSharedContext() );
  49. material.needsUpdate = true;
  50. return super.setup( builder );
  51. }
  52. }
  53. export default ParallaxBarrierPassNode;
  54. /**
  55. * TSL function for creating an parallax barrier pass node.
  56. *
  57. * @tsl
  58. * @function
  59. * @param {Scene} scene - The scene to render.
  60. * @param {Camera} camera - The camera to render the scene with.
  61. * @returns {ParallaxBarrierPassNode}
  62. */
  63. export const parallaxBarrierPass = ( scene, camera ) => nodeObject( new ParallaxBarrierPassNode( scene, camera ) );
粤ICP备19079148号