WebGLCubeRenderTarget.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { BackSide, LinearFilter, LinearMipmapLinearFilter, NoBlending, RGBAFormat } from '../constants.js';
  2. import { Mesh } from '../objects/Mesh.js';
  3. import { BoxGeometry } from '../geometries/BoxGeometry.js';
  4. import { ShaderMaterial } from '../materials/ShaderMaterial.js';
  5. import { cloneUniforms } from './shaders/UniformsUtils.js';
  6. import { WebGLRenderTarget } from './WebGLRenderTarget.js';
  7. import { CubeCamera } from '../cameras/CubeCamera.js';
  8. import { CubeTexture } from '../textures/CubeTexture.js';
  9. class WebGLCubeRenderTarget extends WebGLRenderTarget {
  10. constructor( size, options, dummy ) {
  11. if ( Number.isInteger( options ) ) {
  12. console.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );
  13. options = dummy;
  14. }
  15. super( size, size, options );
  16. options = options || {};
  17. this.texture = new CubeTexture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
  18. this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
  19. this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
  20. this.texture._needsFlipEnvMap = false;
  21. }
  22. fromEquirectangularTexture( renderer, texture ) {
  23. this.texture.type = texture.type;
  24. this.texture.format = RGBAFormat; // see #18859
  25. this.texture.encoding = texture.encoding;
  26. this.texture.generateMipmaps = texture.generateMipmaps;
  27. this.texture.minFilter = texture.minFilter;
  28. this.texture.magFilter = texture.magFilter;
  29. const shader = {
  30. uniforms: {
  31. tEquirect: { value: null },
  32. },
  33. vertexShader: /* glsl */`
  34. varying vec3 vWorldDirection;
  35. vec3 transformDirection( in vec3 dir, in mat4 matrix ) {
  36. return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );
  37. }
  38. void main() {
  39. vWorldDirection = transformDirection( position, modelMatrix );
  40. #include <begin_vertex>
  41. #include <project_vertex>
  42. }
  43. `,
  44. fragmentShader: /* glsl */`
  45. uniform sampler2D tEquirect;
  46. varying vec3 vWorldDirection;
  47. #include <common>
  48. void main() {
  49. vec3 direction = normalize( vWorldDirection );
  50. vec2 sampleUV = equirectUv( direction );
  51. gl_FragColor = texture2D( tEquirect, sampleUV );
  52. }
  53. `
  54. };
  55. const geometry = new BoxGeometry( 5, 5, 5 );
  56. const material = new ShaderMaterial( {
  57. name: 'CubemapFromEquirect',
  58. uniforms: cloneUniforms( shader.uniforms ),
  59. vertexShader: shader.vertexShader,
  60. fragmentShader: shader.fragmentShader,
  61. side: BackSide,
  62. blending: NoBlending
  63. } );
  64. material.uniforms.tEquirect.value = texture;
  65. const mesh = new Mesh( geometry, material );
  66. const currentMinFilter = texture.minFilter;
  67. // Avoid blurred poles
  68. if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;
  69. const camera = new CubeCamera( 1, 10, this );
  70. camera.update( renderer, mesh );
  71. texture.minFilter = currentMinFilter;
  72. mesh.geometry.dispose();
  73. mesh.material.dispose();
  74. return this;
  75. }
  76. clear( renderer, color, depth, stencil ) {
  77. const currentRenderTarget = renderer.getRenderTarget();
  78. for ( let i = 0; i < 6; i ++ ) {
  79. renderer.setRenderTarget( this, i );
  80. renderer.clear( color, depth, stencil );
  81. }
  82. renderer.setRenderTarget( currentRenderTarget );
  83. }
  84. }
  85. WebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;
  86. export { WebGLCubeRenderTarget };
粤ICP备19079148号