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

WGSLNodeBuilder: Fix out-of-bounds access with `textureLoad()`. (#32826)

Michael Herzog 1 месяц назад
Родитель
Сommit
d89cd73280
1 измененных файлов с 5 добавлено и 1 удалено
  1. 5 1
      src/renderers/webgpu/nodes/WGSLNodeBuilder.js

+ 5 - 1
src/renderers/webgpu/nodes/WGSLNodeBuilder.js

@@ -518,6 +518,7 @@ class WGSLNodeBuilder extends NodeBuilder {
 		const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
 		const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
 
 
 		const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
 		const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
+		const textureDimensionMargin = ( vecType === 'vec3' ) ? 'vec3<u32>( 1, 1, 1 )' : 'vec2<u32>( 1, 1 )';
 
 
 		if ( offsetSnippet ) {
 		if ( offsetSnippet ) {
 
 
@@ -525,7 +526,10 @@ class WGSLNodeBuilder extends NodeBuilder {
 
 
 		}
 		}
 
 
-		uvSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
+		const clampMin = `${ vecType }<f32>( 0 )`;
+		const clampMax = `${ vecType }<f32>( ${ textureDimension } - ${ textureDimensionMargin } )`;
+
+		uvSnippet = `${ vecType }<u32>( clamp( floor( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) ), ${ clampMin }, ${ clampMax } ) )`;
 
 
 		return this.generateTextureLoad( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, null );
 		return this.generateTextureLoad( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, null );
 
 

粤ICP备19079148号