engine.renderTargetCube.ts 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { InternalTexture, InternalTextureSource } from '../../Materials/Textures/internalTexture';
  2. import { Logger } from '../../Misc/logger';
  3. import { RenderTargetCreationOptions } from '../../Materials/Textures/renderTargetCreationOptions';
  4. import { Constants } from '../constants';
  5. import { ThinEngine } from '../thinEngine';
  6. declare module "../../Engines/thinEngine" {
  7. export interface ThinEngine {
  8. /**
  9. * Creates a new render target cube texture
  10. * @param size defines the size of the texture
  11. * @param options defines the options used to create the texture
  12. * @returns a new render target cube texture stored in an InternalTexture
  13. */
  14. createRenderTargetCubeTexture(size: number, options?: Partial<RenderTargetCreationOptions>): InternalTexture;
  15. }
  16. }
  17. ThinEngine.prototype.createRenderTargetCubeTexture = function(size: number, options?: Partial<RenderTargetCreationOptions>): InternalTexture {
  18. let fullOptions = {
  19. generateMipMaps: true,
  20. generateDepthBuffer: true,
  21. generateStencilBuffer: false,
  22. type: Constants.TEXTURETYPE_UNSIGNED_INT,
  23. samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,
  24. format: Constants.TEXTUREFORMAT_RGBA,
  25. ...options
  26. };
  27. fullOptions.generateStencilBuffer = fullOptions.generateDepthBuffer && fullOptions.generateStencilBuffer;
  28. if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {
  29. // if floating point linear (gl.FLOAT) then force to NEAREST_SAMPLINGMODE
  30. fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;
  31. }
  32. else if (fullOptions.type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {
  33. // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE
  34. fullOptions.samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;
  35. }
  36. var gl = this._gl;
  37. var texture = new InternalTexture(this, InternalTextureSource.RenderTarget);
  38. this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, texture, true);
  39. var filters = this._getSamplingParameters(fullOptions.samplingMode, fullOptions.generateMipMaps);
  40. if (fullOptions.type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {
  41. fullOptions.type = Constants.TEXTURETYPE_UNSIGNED_INT;
  42. Logger.Warn("Float textures are not supported. Cube render target forced to TEXTURETYPE_UNESIGNED_BYTE type");
  43. }
  44. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filters.mag);
  45. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filters.min);
  46. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  47. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
  48. for (var face = 0; face < 6; face++) {
  49. gl.texImage2D((gl.TEXTURE_CUBE_MAP_POSITIVE_X + face), 0, this._getRGBABufferInternalSizedFormat(fullOptions.type, fullOptions.format), size, size, 0, this._getInternalFormat(fullOptions.format), this._getWebGLTextureType(fullOptions.type), null);
  50. }
  51. // Create the framebuffer
  52. var framebuffer = gl.createFramebuffer();
  53. this._bindUnboundFramebuffer(framebuffer);
  54. texture._depthStencilBuffer = this._setupFramebufferDepthAttachments(fullOptions.generateStencilBuffer, fullOptions.generateDepthBuffer, size, size);
  55. // MipMaps
  56. if (fullOptions.generateMipMaps) {
  57. gl.generateMipmap(gl.TEXTURE_CUBE_MAP);
  58. }
  59. // Unbind
  60. this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);
  61. gl.bindRenderbuffer(gl.RENDERBUFFER, null);
  62. this._bindUnboundFramebuffer(null);
  63. texture._framebuffer = framebuffer;
  64. texture.width = size;
  65. texture.height = size;
  66. texture.isReady = true;
  67. texture.isCube = true;
  68. texture.samples = 1;
  69. texture.generateMipMaps = fullOptions.generateMipMaps;
  70. texture.samplingMode = fullOptions.samplingMode;
  71. texture.type = fullOptions.type;
  72. texture.format = fullOptions.format;
  73. texture._generateDepthBuffer = fullOptions.generateDepthBuffer;
  74. texture._generateStencilBuffer = fullOptions.generateStencilBuffer;
  75. this._internalTexturesCache.push(texture);
  76. return texture;
  77. };