|
@@ -1,5 +1,6 @@
|
|
|
import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
|
|
import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
|
|
|
import Backend from '../common/Backend.js';
|
|
import Backend from '../common/Backend.js';
|
|
|
|
|
+import { getCacheKey } from '../common/RenderContext.js';
|
|
|
|
|
|
|
|
import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
|
|
import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
|
|
|
import WebGLState from './utils/WebGLState.js';
|
|
import WebGLState from './utils/WebGLState.js';
|
|
@@ -255,12 +256,13 @@ class WebGLBackend extends Backend {
|
|
|
const renderTargetContextData = this.get( renderContext.renderTarget );
|
|
const renderTargetContextData = this.get( renderContext.renderTarget );
|
|
|
|
|
|
|
|
const { samples } = renderContext.renderTarget;
|
|
const { samples } = renderContext.renderTarget;
|
|
|
- const fb = renderTargetContextData.framebuffer;
|
|
|
|
|
-
|
|
|
|
|
- const mask = gl.COLOR_BUFFER_BIT;
|
|
|
|
|
|
|
|
|
|
if ( samples > 0 ) {
|
|
if ( samples > 0 ) {
|
|
|
|
|
|
|
|
|
|
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
|
|
|
+
|
|
|
|
|
+ const mask = gl.COLOR_BUFFER_BIT;
|
|
|
|
|
+
|
|
|
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
|
|
|
|
|
|
const textures = renderContext.textures;
|
|
const textures = renderContext.textures;
|
|
@@ -1236,38 +1238,38 @@ class WebGLBackend extends Backend {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- _setFramebuffer( renderContext ) {
|
|
|
|
|
|
|
+ _setFramebuffer( descriptor ) {
|
|
|
|
|
|
|
|
const { gl, state } = this;
|
|
const { gl, state } = this;
|
|
|
|
|
|
|
|
let currentFrameBuffer = null;
|
|
let currentFrameBuffer = null;
|
|
|
|
|
|
|
|
- if ( renderContext.textures !== null ) {
|
|
|
|
|
|
|
+ if ( descriptor.textures !== null ) {
|
|
|
|
|
|
|
|
- const renderTarget = renderContext.renderTarget;
|
|
|
|
|
|
|
+ const renderTarget = descriptor.renderTarget;
|
|
|
const renderTargetContextData = this.get( renderTarget );
|
|
const renderTargetContextData = this.get( renderTarget );
|
|
|
const { samples, depthBuffer, stencilBuffer } = renderTarget;
|
|
const { samples, depthBuffer, stencilBuffer } = renderTarget;
|
|
|
- const cubeFace = this.renderer._activeCubeFace;
|
|
|
|
|
|
|
+
|
|
|
const isCube = renderTarget.isWebGLCubeRenderTarget === true;
|
|
const isCube = renderTarget.isWebGLCubeRenderTarget === true;
|
|
|
|
|
|
|
|
let msaaFb = renderTargetContextData.msaaFrameBuffer;
|
|
let msaaFb = renderTargetContextData.msaaFrameBuffer;
|
|
|
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
|
|
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
|
|
|
|
|
|
|
|
|
|
+ const cacheKey = getCacheKey( descriptor );
|
|
|
|
|
+
|
|
|
let fb;
|
|
let fb;
|
|
|
|
|
|
|
|
if ( isCube ) {
|
|
if ( isCube ) {
|
|
|
|
|
|
|
|
- if ( renderTargetContextData.cubeFramebuffers === undefined ) {
|
|
|
|
|
-
|
|
|
|
|
- renderTargetContextData.cubeFramebuffers = [];
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ renderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );
|
|
|
|
|
|
|
|
- fb = renderTargetContextData.cubeFramebuffers[ cubeFace ];
|
|
|
|
|
|
|
+ fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
|
|
- fb = renderTargetContextData.framebuffer;
|
|
|
|
|
|
|
+ renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
|
|
|
|
|
+
|
|
|
|
|
+ fb = renderTargetContextData.framebuffers[ cacheKey ];
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1277,22 +1279,27 @@ class WebGLBackend extends Backend {
|
|
|
|
|
|
|
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
|
|
|
|
|
|
- const textures = renderContext.textures;
|
|
|
|
|
|
|
+ const textures = descriptor.textures;
|
|
|
|
|
|
|
|
if ( isCube ) {
|
|
if ( isCube ) {
|
|
|
|
|
|
|
|
- renderTargetContextData.cubeFramebuffers[ cubeFace ] = fb;
|
|
|
|
|
|
|
+ renderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;
|
|
|
|
|
+
|
|
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
|
|
|
|
|
|
|
|
+ const cubeFace = this.renderer._activeCubeFace;
|
|
|
|
|
+
|
|
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
|
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
|
|
|
|
+ renderTargetContextData.framebuffers[ cacheKey ] = fb;
|
|
|
|
|
+
|
|
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
|
|
|
|
|
const texture = textures[ i ];
|
|
const texture = textures[ i ];
|
|
|
const textureData = this.get( texture );
|
|
const textureData = this.get( texture );
|
|
|
- textureData.renderTarget = renderContext.renderTarget;
|
|
|
|
|
|
|
+ textureData.renderTarget = descriptor.renderTarget;
|
|
|
|
|
|
|
|
const attachment = gl.COLOR_ATTACHMENT0 + i;
|
|
const attachment = gl.COLOR_ATTACHMENT0 + i;
|
|
|
|
|
|
|
@@ -1300,15 +1307,13 @@ class WebGLBackend extends Backend {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- renderTargetContextData.framebuffer = fb;
|
|
|
|
|
-
|
|
|
|
|
- state.drawBuffers( renderContext, fb );
|
|
|
|
|
|
|
+ state.drawBuffers( descriptor, fb );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ( renderContext.depthTexture !== null ) {
|
|
|
|
|
|
|
+ if ( descriptor.depthTexture !== null ) {
|
|
|
|
|
|
|
|
- const textureData = this.get( renderContext.depthTexture );
|
|
|
|
|
|
|
+ const textureData = this.get( descriptor.depthTexture );
|
|
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
|
|
|
|
|
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
@@ -1329,11 +1334,10 @@ class WebGLBackend extends Backend {
|
|
|
|
|
|
|
|
const msaaRenderbuffers = [];
|
|
const msaaRenderbuffers = [];
|
|
|
|
|
|
|
|
- const textures = renderContext.textures;
|
|
|
|
|
|
|
+ const textures = descriptor.textures;
|
|
|
|
|
|
|
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
|
|
|
|
|
|
-
|
|
|
|
|
msaaRenderbuffers[ i ] = gl.createRenderbuffer();
|
|
msaaRenderbuffers[ i ] = gl.createRenderbuffer();
|
|
|
|
|
|
|
|
gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
@@ -1347,10 +1351,10 @@ class WebGLBackend extends Backend {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const texture = renderContext.textures[ i ];
|
|
|
|
|
|
|
+ const texture = descriptor.textures[ i ];
|
|
|
const textureData = this.get( texture );
|
|
const textureData = this.get( texture );
|
|
|
|
|
|
|
|
- gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, renderContext.width, renderContext.height );
|
|
|
|
|
|
|
+ gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );
|
|
|
gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1362,7 +1366,7 @@ class WebGLBackend extends Backend {
|
|
|
if ( depthRenderbuffer === undefined ) {
|
|
if ( depthRenderbuffer === undefined ) {
|
|
|
|
|
|
|
|
depthRenderbuffer = gl.createRenderbuffer();
|
|
depthRenderbuffer = gl.createRenderbuffer();
|
|
|
- this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, renderContext );
|
|
|
|
|
|
|
+ this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
|
|
|
|
|
|
|
|
renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
|
|
renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
|
|
|
|
|
|