Skip to content

Commit

Permalink
TSL: Vertex shader revision (#30108)
Browse files Browse the repository at this point in the history
* vertex shader revision

* revision

* cleanup

* Update Three.TSL.js

* Update webgpu_instance_sprites.jpg

* Update webgpu_tsl_galaxy.jpg

* renames
  • Loading branch information
sunag authored Dec 12, 2024
1 parent 234945c commit 0d57860
Show file tree
Hide file tree
Showing 13 changed files with 66 additions and 82 deletions.
2 changes: 1 addition & 1 deletion examples/jsm/materials/LDrawConditionalLineNodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class LDrawConditionalLineMaterial extends NodeMaterial {

varyingProperty( 'float', 'discardFlag' ).assign( discardFlag );

return modelViewProjection();
return modelViewProjection;

} )();

Expand Down
2 changes: 1 addition & 1 deletion examples/jsm/objects/SkyMesh.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class SkyMesh extends Mesh {

// position

const position = modelViewProjection();
const position = modelViewProjection;
position.z.assign( position.w ); // set z to camera.far

return position;
Expand Down
6 changes: 3 additions & 3 deletions examples/jsm/tsl/display/SMAANode.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ class SMAANode extends TempNode {
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );
varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down Expand Up @@ -405,7 +405,7 @@ class SMAANode extends TempNode {
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );
varyingProperty( 'vec4', 'vOffset2' ).assign( vOffset2 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down Expand Up @@ -507,7 +507,7 @@ class SMAANode extends TempNode {
//varyingProperty( 'vec4', 'vOffset0' ).assign( vOffset0 );
varyingProperty( 'vec4', 'vOffset1' ).assign( vOffset1 );

return modelViewProjection();
return modelViewProjection;

} );

Expand Down
Binary file modified examples/screenshots/webgpu_instance_sprites.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified examples/screenshots/webgpu_tsl_galaxy.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions src/Three.TSL.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ export const grayscale = TSL.grayscale;
export const greaterThan = TSL.greaterThan;
export const greaterThanEqual = TSL.greaterThanEqual;
export const hash = TSL.hash;
export const highPrecisionModelNormalViewMatrix = TSL.highPrecisionModelNormalViewMatrix;
export const highPrecisionModelViewMatrix = TSL.highPrecisionModelViewMatrix;
export const highpModelNormalViewMatrix = TSL.highpModelNormalViewMatrix;
export const highpModelViewMatrix = TSL.highpModelViewMatrix;
export const hue = TSL.hue;
export const instance = TSL.instance;
export const instanceIndex = TSL.instanceIndex;
Expand Down Expand Up @@ -223,6 +223,7 @@ export const log2 = TSL.log2;
export const logarithmicDepthToViewZ = TSL.logarithmicDepthToViewZ;
export const loop = TSL.loop;
export const luminance = TSL.luminance;
export const mediumpModelViewMatrix = TSL.mediumpModelViewMatrix;
export const mat2 = TSL.mat2;
export const mat3 = TSL.mat3;
export const mat4 = TSL.mat4;
Expand Down
34 changes: 23 additions & 11 deletions src/materials/nodes/NodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { cameraFar, cameraNear } from '../../nodes/accessors/Camera.js';
import { clipping, clippingAlpha, hardwareClipping } from '../../nodes/accessors/ClippingNode.js';
import NodeMaterialObserver from './manager/NodeMaterialObserver.js';
import getAlphaHashThreshold from '../../nodes/functions/material/getAlphaHashThreshold.js';
import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';

class NodeMaterial extends Material {

Expand Down Expand Up @@ -100,6 +101,7 @@ class NodeMaterial extends Material {
setup( builder ) {

builder.context.setupNormal = () => this.setupNormal( builder );
builder.context.setupPositionView = () => this.setupPositionView( builder );

const renderer = builder.renderer;
const renderTarget = renderer.getRenderTarget();
Expand All @@ -108,7 +110,9 @@ class NodeMaterial extends Material {

builder.addStack();

builder.stack.outputNode = this.vertexNode || this.setupPosition( builder );
const vertexNode = this.vertexNode || this.setupVertex( builder );

builder.stack.outputNode = vertexNode;

this.setupHardwareClipping( builder );

Expand Down Expand Up @@ -307,14 +311,27 @@ class NodeMaterial extends Material {

}

setupPosition( builder ) {
setupPositionView() {

return modelViewMatrix.mul( positionLocal ).xyz;

}

const { object } = builder;
const geometry = object.geometry;
setupVertex( builder ) {

builder.addStack();

// Vertex
this.setupPosition( builder );

builder.context.vertex = builder.removeStack();

return modelViewProjection;

}

setupPosition( builder ) {

const { object, geometry } = builder;

if ( geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color ) {

Expand Down Expand Up @@ -356,12 +373,7 @@ class NodeMaterial extends Material {

}

const mvp = modelViewProjection();

builder.context.vertex = builder.removeStack();
builder.context.mvp = mvp;

return mvp;
return positionLocal;

}

Expand Down
24 changes: 9 additions & 15 deletions src/materials/nodes/SpriteNodeMaterial.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import NodeMaterial from './NodeMaterial.js';
import { cameraProjectionMatrix } from '../../nodes/accessors/Camera.js';
import { materialRotation } from '../../nodes/accessors/MaterialNode.js';
import { modelViewMatrix, modelWorldMatrix } from '../../nodes/accessors/ModelNode.js';
import { positionLocal } from '../../nodes/accessors/Position.js';
import { positionGeometry, positionLocal } from '../../nodes/accessors/Position.js';
import { rotate } from '../../nodes/utils/RotateNode.js';
import { float, vec2, vec3, vec4 } from '../../nodes/tsl/TSLBase.js';
import { float, vec2, vec4 } from '../../nodes/tsl/TSLBase.js';

import { SpriteMaterial } from '../SpriteMaterial.js';
import { reference } from '../../nodes/accessors/ReferenceBaseNode.js';
Expand Down Expand Up @@ -38,17 +38,17 @@ class SpriteNodeMaterial extends NodeMaterial {

}

setupPosition( { object, camera, context } ) {
setupPositionView( builder ) {

const { object, camera } = builder;

const sizeAttenuation = this.sizeAttenuation;

// < VERTEX STAGE >

const { positionNode, rotationNode, scaleNode } = this;

const vertex = positionLocal;
const { rotationNode, scaleNode } = this;

let mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );
const mvPosition = modelViewMatrix.mul( positionLocal );

let scale = vec2( modelWorldMatrix[ 0 ].xyz.length(), modelWorldMatrix[ 1 ].xyz.length() );

Expand All @@ -74,7 +74,7 @@ class SpriteNodeMaterial extends NodeMaterial {

}

let alignedPosition = vertex.xy;
let alignedPosition = positionGeometry.xy;

if ( object.center && object.center.isVector2 === true ) {

Expand All @@ -90,13 +90,7 @@ class SpriteNodeMaterial extends NodeMaterial {

const rotatedPosition = rotate( alignedPosition, rotation );

mvPosition = vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );

const modelViewProjection = cameraProjectionMatrix.mul( mvPosition );

context.vertex = vertex;

return modelViewProjection;
return vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );

}

Expand Down
1 change: 0 additions & 1 deletion src/nodes/Nodes.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ export { default as MaterialReferenceNode } from './accessors/MaterialReferenceN
export { default as RendererReferenceNode } from './accessors/RendererReferenceNode.js';
export { default as MorphNode } from './accessors/MorphNode.js';
export { default as ModelNode } from './accessors/ModelNode.js';
export { default as ModelViewProjectionNode } from './accessors/ModelViewProjectionNode.js';
export { default as Object3DNode } from './accessors/Object3DNode.js';
export { default as PointUVNode } from './accessors/PointUVNode.js';
export { default as ReferenceNode } from './accessors/ReferenceNode.js';
Expand Down
21 changes: 16 additions & 5 deletions src/nodes/accessors/ModelNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,20 @@ export const modelScale = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.SCAL
export const modelViewPosition = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.VIEW_POSITION );
export const modelNormalMatrix = /*@__PURE__*/ uniform( new Matrix3() ).onObjectUpdate( ( { object }, self ) => self.value.getNormalMatrix( object.matrixWorld ) );
export const modelWorldMatrixInverse = /*@__PURE__*/ uniform( new Matrix4() ).onObjectUpdate( ( { object }, self ) => self.value.copy( object.matrixWorld ).invert() );
export const modelViewMatrix = /*@__PURE__*/ cameraViewMatrix.mul( modelWorldMatrix ).toVar( 'modelViewMatrix' );

export const highPrecisionModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
export const modelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

return builder.renderer.nodes.modelViewMatrix || mediumpModelViewMatrix;

} ).once() )().toVar( 'modelViewMatrix' );

// GPU Precision

export const mediumpModelViewMatrix = /*@__PURE__*/ cameraViewMatrix.mul( modelWorldMatrix );

// CPU Precision

export const highpModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

builder.context.isHighPrecisionModelViewMatrix = true;

Expand All @@ -51,9 +62,9 @@ export const highPrecisionModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

} );

} ).once() )().toVar( 'highPrecisionModelViewMatrix' );
} ).once() )().toVar( 'highpModelViewMatrix' );

export const highPrecisionModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
export const highpModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {

const isHighPrecisionModelViewMatrix = builder.context.isHighPrecisionModelViewMatrix;

Expand All @@ -69,4 +80,4 @@ export const highPrecisionModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder

} );

} ).once() )().toVar( 'highPrecisionModelNormalMatrix' );
} ).once() )().toVar( 'highpModelNormalViewMatrix' );
42 changes: 2 additions & 40 deletions src/nodes/accessors/ModelViewProjectionNode.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,4 @@
import TempNode from '../core/TempNode.js';
import { cameraProjectionMatrix } from './Camera.js';
import { positionLocal } from './Position.js';
import { nodeProxy, varying } from '../tsl/TSLBase.js';
import { modelViewMatrix } from './ModelNode.js';
import { positionView } from './Position.js';

class ModelViewProjectionNode extends TempNode {

static get type() {

return 'ModelViewProjectionNode';

}

constructor( positionNode = null ) {

super( 'vec4' );

this.positionNode = positionNode;

}

setup( builder ) {

if ( builder.shaderStage === 'fragment' ) {

return varying( builder.context.mvp );

}

const position = this.positionNode || positionLocal;
const viewMatrix = builder.renderer.nodes.modelViewMatrix || modelViewMatrix;

return cameraProjectionMatrix.mul( viewMatrix ).mul( position );

}

}

export default ModelViewProjectionNode;

export const modelViewProjection = /*@__PURE__*/ nodeProxy( ModelViewProjectionNode );
export const modelViewProjection = /*@__PURE__*/ cameraProjectionMatrix.mul( positionView ).varying( 'v_modelViewProjection' );
9 changes: 7 additions & 2 deletions src/nodes/accessors/Position.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { attribute } from '../core/AttributeNode.js';
import { modelWorldMatrix, modelViewMatrix } from './ModelNode.js';
import { Fn } from '../tsl/TSLCore.js';
import { modelWorldMatrix } from './ModelNode.js';

/** @module Position **/

Expand Down Expand Up @@ -44,7 +45,11 @@ export const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirec
*
* @type {VaryingNode<vec3>}
*/
export const positionView = /*@__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' ).context( { needsPositionReassign: true } );
export const positionView = /*@__PURE__*/ ( Fn( ( builder ) => {

return builder.context.setupPositionView();

}, 'vec3' ).once() )().varying( 'v_positionView' ).context( { needsPositionReassign: true } );

/**
* TSL object that represents the position view direction of the current rendered object.
Expand Down
2 changes: 1 addition & 1 deletion src/renderers/common/Background.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class Background extends DataMap {
getTextureLevel: () => backgroundBlurriness
} );

let viewProj = modelViewProjection();
let viewProj = modelViewProjection;
viewProj = viewProj.setZ( viewProj.w );

const nodeMaterial = new NodeMaterial();
Expand Down

0 comments on commit 0d57860

Please sign in to comment.