|
@@ -12,7 +12,15 @@ import {
|
|
|
SRGBColorSpace,
|
|
|
LinearSRGBColorSpace,
|
|
|
sRGBEncoding,
|
|
|
- LinearEncoding
|
|
|
+ LinearEncoding,
|
|
|
+ RGBAIntegerFormat,
|
|
|
+ RGIntegerFormat,
|
|
|
+ RedIntegerFormat,
|
|
|
+ UnsignedIntType,
|
|
|
+ UnsignedShortType,
|
|
|
+ UnsignedInt248Type,
|
|
|
+ UnsignedShort4444Type,
|
|
|
+ UnsignedShort5551Type
|
|
|
} from '../constants.js';
|
|
|
import { Frustum } from '../math/Frustum.js';
|
|
|
import { Matrix4 } from '../math/Matrix4.js';
|
|
@@ -87,6 +95,9 @@ class WebGLRenderer {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ const uintClearColor = new Uint32Array( 4 );
|
|
|
+ const intClearColor = new Int32Array( 4 );
|
|
|
+
|
|
|
let currentRenderList = null;
|
|
|
let currentRenderState = null;
|
|
|
|
|
@@ -551,7 +562,65 @@ class WebGLRenderer {
|
|
|
|
|
|
let bits = 0;
|
|
|
|
|
|
- if ( color ) bits |= _gl.COLOR_BUFFER_BIT;
|
|
|
+ if ( color ) {
|
|
|
+
|
|
|
+ // check if we're trying to clear an integer target
|
|
|
+ let isIntegerFormat = false;
|
|
|
+ if ( _currentRenderTarget !== null ) {
|
|
|
+
|
|
|
+ const targetFormat = _currentRenderTarget.texture.format;
|
|
|
+ isIntegerFormat = targetFormat === RGBAIntegerFormat ||
|
|
|
+ targetFormat === RGIntegerFormat ||
|
|
|
+ targetFormat === RedIntegerFormat;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // use the appropriate clear functions to clear the target if it's a signed
|
|
|
+ // or unsigned integer target
|
|
|
+ if ( isIntegerFormat ) {
|
|
|
+
|
|
|
+ const targetType = _currentRenderTarget.texture.type;
|
|
|
+ const isUnsignedType = targetType === UnsignedByteType ||
|
|
|
+ targetType === UnsignedIntType ||
|
|
|
+ targetType === UnsignedShortType ||
|
|
|
+ targetType === UnsignedInt248Type ||
|
|
|
+ targetType === UnsignedShort4444Type ||
|
|
|
+ targetType === UnsignedShort5551Type;
|
|
|
+
|
|
|
+ const clearColor = background.getClearColor();
|
|
|
+ const a = background.getClearAlpha();
|
|
|
+ const r = clearColor.r;
|
|
|
+ const g = clearColor.g;
|
|
|
+ const b = clearColor.b;
|
|
|
+
|
|
|
+ const __webglFramebuffer = properties.get( _currentRenderTarget ).__webglFramebuffer;
|
|
|
+
|
|
|
+ if ( isUnsignedType ) {
|
|
|
+
|
|
|
+ uintClearColor[ 0 ] = r;
|
|
|
+ uintClearColor[ 1 ] = g;
|
|
|
+ uintClearColor[ 2 ] = b;
|
|
|
+ uintClearColor[ 3 ] = a;
|
|
|
+ _gl.clearBufferuiv( _gl.COLOR, __webglFramebuffer, uintClearColor );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ intClearColor[ 0 ] = r;
|
|
|
+ intClearColor[ 1 ] = g;
|
|
|
+ intClearColor[ 2 ] = b;
|
|
|
+ intClearColor[ 3 ] = a;
|
|
|
+ _gl.clearBufferiv( _gl.COLOR, __webglFramebuffer, intClearColor );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ bits |= _gl.COLOR_BUFFER_BIT;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;
|
|
|
if ( stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
|
|
|
|