Просмотр исходного кода

NodeMaterialObserver: Fix buffer resize when `transmission` is used (#29735)

sunag 1 год назад
Родитель
Сommit
a2befb6457
1 измененных файлов с 47 добавлено и 0 удалено
  1. 47 0
      src/materials/nodes/manager/NodeMaterialObserver.js

+ 47 - 0
src/materials/nodes/manager/NodeMaterialObserver.js

@@ -1,3 +1,5 @@
+import { Vector2 } from '../../../math/Vector2.js';
+
 const refreshUniforms = [
 	'alphaMap',
 	'alphaTest',
@@ -51,6 +53,8 @@ const refreshUniforms = [
 	'transmissionMap'
 ];
 
+const _vector2 = /*@__PURE__*/ new Vector2();
+
 class NodeMaterialObserver {
 
 	constructor( builder ) {
@@ -115,6 +119,15 @@ class NodeMaterialObserver {
 
 			}
 
+			if ( data.material.transmission > 0 ) {
+
+				const bufferSize = this._getFrameBufferSize( renderObject );
+
+				data.bufferWidth = bufferSize.x;
+				data.bufferHeight = bufferSize.y;
+
+			}
+
 			this.renderObjects.set( renderObject, data );
 
 		}
@@ -193,6 +206,25 @@ class NodeMaterialObserver {
 
 	}
 
+	_getFrameBufferSize( renderObject ) {
+
+		const renderer = renderObject.renderer;
+		const renderTarget = renderer.getRenderTarget();
+
+		if ( renderTarget ) {
+
+			_vector2.set( renderTarget.width, renderTarget.height );
+
+		} else {
+
+			renderer.getDrawingBufferSize( _vector2 );
+
+		}
+
+		return _vector2;
+
+	}
+
 	equals( renderObject ) {
 
 		const { object, material, geometry } = renderObject;
@@ -249,6 +281,21 @@ class NodeMaterialObserver {
 
 		}
 
+		if ( materialData.transmission > 0 ) {
+
+			const bufferSize = this._getFrameBufferSize( renderObject );
+
+			if ( renderObjectData.bufferWidth !== bufferSize.x || renderObjectData.bufferHeight !== bufferSize.y ) {
+
+				renderObjectData.bufferWidth = bufferSize.x;
+				renderObjectData.bufferHeight = bufferSize.y;
+
+				return false;
+
+			}
+
+		}
+
 		// geometry
 
 		const storedGeometryData = renderObjectData.geometry;

粤ICP备19079148号